要实现多客户端同时连接到服务端,主要有以下方法:
- 服务端使用ServerSocket的accept()方法循环接收客户端连接:
// 服务端
ServerSocket server = new ServerSocket(8000);
while (true) {
Socket socket = server.accept();
// 处理客户端连接
}
- 为每一个客户端连接创建一个线程,进行处理:
// 服务端
ServerSocket server = new ServerSocket(8000);
while (true) {
final Socket socket = server.accept();
new Thread() {
public void run() {
// 处理客户端连接
}
}.start();
}
- 使用线程池来管理客户端连接线程:
// 服务端
ServerSocket server = new ServerSocket(8000);
ExecutorService pool = Executors.newFixedThreadPool(10);
while (true) {
final Socket socket = server.accept();
pool.execute(() -> {
// 处理客户端连接
});
}
- 使用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等方式实现服务端同时响应多个客户端的连接和数据读写,从而实现多客户端同时连接的效果。