如何实现多客户端同时连接到服务端?

要实现多客户端同时连接到服务端,主要有以下方法:

  1. 服务端使用ServerSocket的accept()方法循环接收客户端连接:
// 服务端
ServerSocket server = new ServerSocket(8000);
while (true) {
    Socket socket = server.accept();
    // 处理客户端连接
}
  1. 为每一个客户端连接创建一个线程,进行处理:
// 服务端 
ServerSocket server = new ServerSocket(8000);
while (true) {
    final Socket socket = server.accept();
    new Thread() {
        public void run() {
            // 处理客户端连接
        }
    }.start();
}
  1. 使用线程池来管理客户端连接线程:
// 服务端
ServerSocket server = new ServerSocket(8000); 
ExecutorService pool = Executors.newFixedThreadPool(10); 

while (true) {
    final Socket socket = server.accept();
    pool.execute(() -> { 
        // 处理客户端连接
    });
}
  1. 使用Selector选择器进行异步非阻塞IO:
  • ServerSocketChannel注册accept事件到Selector。
  • accept后的SocketChannel注册读事件到Selector。
  • Selector轮询就绪的Channel并处理。
// 服务端
ServerSocketChannel server = ServerSocketChannel.open();
server.bind(new InetSocketAddress(8000));
server.configureBlocking(false);

Selector selector = Selector.open();
server.register(selector, SelectionKey.OP_ACCEPT);

while (true) {
    selector.select();
    Set<SelectionKey> keys = selector.selectedKeys(); 
    for (SelectionKey key : keys) {
        if (key.isAcceptable()) {
            SocketChannel channel = server.accept();
            channel.configureBlocking(false);
            channel.register(selector, SelectionKey.OP_READ);
        } else if (key.isReadable()) {
            // 读取客户端数据
        }
    }
} 

综上,主要通过多线程、线程池以及异步非阻塞IO等方式实现服务端同时响应多个客户端的连接和数据读写,从而实现多客户端同时连接的效果。