一个简单的Socket通信例子

客户端与服务端交互流程

客户端

public class Client {
    // 服务端 host
    private static final String HOST = "127.0.0.1";
    // 服务端 port
    private static final int PORT = 8000;
    // 消息发送间隔
    private static final int SLEEP_TIME = 5000;

    public static void main(String[] args) throws IOException {
        // 创建客户端socket
        final Socket socket = new Socket(HOST, PORT);

        new Thread(() -> {
            System.out.println("客户端启动成功!");
            while (true) {
                try {
                    String message = "hello world";
                    System.out.println("客户端发送数据: " + message);
                    socket.getOutputStream().write(message.getBytes());
                } catch (Exception e) {
                    System.out.println("写数据出错!");
                }
                // 睡眠一段时间再发送消息
                sleep();
            }
        }).start();
    }

    private static void sleep() {
        try {
            Thread.sleep(SLEEP_TIME);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

服务端

public class Server {

    private ServerSocket serverSocket;

    public Server(int port) {
        try {
            // 创建服务端 socket 对象
            this.serverSocket = new ServerSocket(port);
            System.out.println("服务端启动成功!端口:" + port);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void start() {
        // 新建子线程处理请求(不阻塞主线程)
        new Thread(() -> doStart()).start();
    }

    private void doStart() {
        while (true) {
            try {
                // 监听消息,没有消息时会阻塞
                Socket client = serverSocket.accept();
                // 消息处理
                new ClientHandler(client).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

服务端处理消息的逻辑

public class ClientHandler {

    private static final int MAX_DATA_LEN = 1024;

    private Socket socket;

    public ClientHandler(Socket socket) {
        this.socket = socket;
    }

    public void start() {
        System.out.println("新客户端接入");
        // 创建子线程接收新客户端的消息
        new Thread(()-> doStart()).start();
    }

    private void doStart() {
        try {
            // 读取消息流
            InputStream inputStream = socket.getInputStream();
            while (true) {
                byte[] data = new byte[MAX_DATA_LEN];
                int len;
                while((len = inputStream.read(data)) != -1) {
                    String message = new String(data, 0, len);
                    System.out.println("客户端传来的消息:" + message);
                    // 将数据回传客户端
                    socket.getOutputStream().write(data);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

服务端启动逻辑

public class ServerBoot {
    private static final int PORT = 8000;

    public static void main(String[] args) {
        Server server = new Server(PORT);
        server.start();
    }
}

结果验证

先启动服务端,再启动客户端,在控制台上可以看到打印的结果。
服务端控制台:

客户端控制台:

发布了149 篇原创文章 · 获赞 100 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/u011212394/article/details/103835428