一个Socket初级应用的例子

这里写一个用socket模拟的服务端-客户端文字交互的小程序。Java网络编程会再开一文(依旧是《Java Core》学习笔记)

代码

服务器端代码

这里我为了让服务端可以接收多个客户端请求,所以服务端的处理代码写在线程中

class Server implements Runnable {

    private final Socket socket;  //传入ServerSocket.accept()返回的Socket,即服务端Socket
    private final String serverName;
    private SharedData shareData; //没用,之前想的是服务端利用共享数据实现广播功能,但是应该不能这么做
    private static final int CHUNK = 1024; //读写的大小单位

    public Server(Socket socket, String serverName, SharedData shareData) {
        this.socket = socket;
        this.serverName = serverName;
        this.shareData = shareData;
    }

    @Override
    public void run() {
        try (BufferedInputStream receive = new BufferedInputStream(socket.getInputStream());
             BufferedOutputStream send = new BufferedOutputStream(socket.getOutputStream());
             Scanner scanner = new Scanner(System.in)) {
            byte[] receiveData = new byte[CHUNK];
            int size;
            while ((size = receive.read(receiveData)) != -1) {
                byte[] trimData = Arrays.copyOf(receiveData, size);
                System.out.printf("服务器%s接收到消息-->%s\n", this.serverName,
                        new String(trimData, StandardCharsets.UTF_8));

                while (scanner.hasNext()) {
                    send.write(scanner.next().getBytes(StandardCharsets.UTF_8));
                    send.flush();
                    break;
                }
            }

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

    public String getServerName() {
        return serverName;
    }
}

客户端代码

客户端的代码可以不写在线程里,用进程直接模拟即可。之后要学习一下客户端之间怎么通过服务端进行交互

class Client implements Runnable {

    private final String serverHost;
    private final int serverPort;
    private final String clientName;
    private static final int CHUNK = 1024;

    public Client(String serverHost, int serverPort, String clientName) {
        this.serverHost = serverHost;
        this.serverPort = serverPort;
        this.clientName = clientName;
    }

    @Override
    public void run() {
        try (Socket socket = new Socket(serverHost, serverPort);
             BufferedOutputStream send = new BufferedOutputStream(socket.getOutputStream());
             BufferedInputStream receive = new BufferedInputStream(socket.getInputStream());
             Scanner scanner = new Scanner(System.in)) {
            while (scanner.hasNext()) {
                send.write(scanner.next().getBytes(StandardCharsets.UTF_8));
                send.flush();

                byte[] receiveData = new byte[CHUNK];
                int size = receive.read(receiveData);
                System.out.printf("客户端%s收到消息-->%s\n", this.clientName,
                        new String(Arrays.copyOf(receiveData, size), StandardCharsets.UTF_8));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String getClientName() {
        return clientName;
    }
}

启动代码

public class ServerLauncher {

    static final int PORT = 8888;
    static final int TEXT_CHUNK_SIZE = 1024 * 1024;

    public static void main(String[] args) {

        int count = 1;
        byte[] shareData = new byte[TEXT_CHUNK_SIZE];
        SharedData sharedData = new SharedData(shareData);

        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            for (;;) {
                System.out.printf("第%d个Server已经启动,等待连接中...\n", count);
                Server server = new Server(serverSocket.accept(), "Server" + count, sharedData);
                Thread t = new Thread(server);
                t.setName(server.getServerName());
                t.start();
                System.out.printf("第%d个Client连接成功!\n", count++);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class ClientLauncher {

    static final String IP = "127.0.0.1";
    static final int PORT = 8888;

    public static void main(String[] args) {
        Client client = new Client(IP, PORT, "client");
        Thread t = new Thread(client);
        t.setName(client.getClientName());
        t.start();
    }
}
posted on 2020-11-20 18:17  老鼠不上树  阅读(268)  评论(0)    收藏  举报