Java Socket简易版一对一聊天程序实现

  • Post author:
  • Post category:java


Socket编程,会将两个通信进程分为客户端和服务器端。一对一聊天软件的客户端和服务器端可任意指定。

Socket编程的服务器端提供ServerSocket类,客户端提供Socket类。服务端的ServerSocket指定绑定的端口,客户端的Socket需要指定ServerSocket的IP和端口进行创建。

服务器端使用无限循环,当接收到客户端的连接时,也生成一个Sokcet对象,这样Server端的Socket对象和客户端的Socket对象就可以通信。

所谓通信对任何一方来说都是发送消息和接受消息,而发送和接受就是使用IO流中的输出流和输入流。


具体看代码和注释:

package com.alan;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
    ServerSocket serverSocket;
    Socket socket;
    BufferedReader reader;
    BufferedWriter writer;
    Scanner sc = new Scanner(System.in);

    public Server() {
        try {
           //创建ServerSocket,设置端口号为6666
            serverSocket = new ServerSocket(6666);
            //当接收到客户端的网络连接请求后,生成一个socket对象,供服务端对客户端通信用
            socket = serverSocket.accept();
//通过socket对象生成输入流和输出流,这里为了方便和效率,使用了字符流和缓冲流进行了包装
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //无线循环,进行聊天交互
            while (true) {
                System.out.println("你:");
                //获取客户端发送的一行文字(以\n结尾)
                String mes = reader.readLine();
                System.out.println(mes);

                System.out.println("我:");
                //控制台输入要发送的文字
                mes = sc.next();
                //发送给客户端
                writer.write(mes + "\n");
                //刷新输出流,发送文字
                writer.flush();
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                reader.close();
                writer.close();
                socket.close();

            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
    public static void main(String[] args) {
        new Server();
    }
}

客户端代码:

package com.alan;

import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.Scanner;

public class Client {
    Socket socket;
    BufferedWriter writer;
    BufferedReader reader;
    Scanner sc = new Scanner(System.in);

    public Client() {
        try {
            //1.创建Socket对象,用于连接服务器,所以要指定服务器端的ip地址和端口号,而客户端油系统自动分配端口
            socket = new Socket("127.0.0.1", 6666);

            //也可以给客户端的Socket手动绑定一个端口
            //   socket = new Socket();
            //  socket.bind(new InetSocketAddress(8083));
            // socket.connect(new InetSocketAddress("127.0.0.1", 6666));
            //通过socket对象生成输入流和输出流,这里为了方便和效率,使用了字符流和缓冲流进行了包装
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new BufferedWriter (new OutputStreamWriter(socket.getOutputStream()));
            //无线循环,进行聊天交互,和服务端的Socket是相同的一个逻辑
            while (true) {
                System.out.println("我:");
                String mes = sc.next();
                writer.write(mes + "\n");
                writer.flush();

                System.out.println("你:");
                mes = reader.readLine();
                System.out.println(mes);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                writer.close();
                socket.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) {
        new Client();
    }
}



版权声明:本文为GodBlessYouAndMe原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。