我正在研究一个服务器/客户端解决方案,该解决方案为每个连接的客户端创建一个新的服务器线程(将其添加到线程池中)。服务器线程通过在客户端套接字输入流上调用readLine()
等待来自关联客户端的消息。如果将线程池设置为1并连接第二个客户端,则在第一个线程关闭之前,线程池不会执行该线程池。我的印象是,如果线程池仅在readLine()上等待,线程池将自动使线程空闲,但我想并非如此。我将如何创建这样的程序?
这是服务器循环,它创建连接到客户端的新服务器线程:
private final static Executor executor = Executors.newFixedThreadPool(MAX_CLIENTS);
while (true) {
clientSocket = serverSocket.accept();
executor.execute(new ChatServer(clientSocket, allClients));
}
运行方法如下:
socketReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())
while(true) {
inputLine = socketReader.readLine();
//then send input line to all clients
}
如前所述,如果FixedThreadPool已在运行MAX_CLIENTS
,则不会执行新的客户端。
答案 0 :(得分:0)
使用当前的设计,随着客户端数量的增加,线程将用光。如果您的线程池大小为20个线程,则不能同时处理21个客户端。因为套接字操作正在阻塞操作。(并且您的ChatServer类将使执行线程忙于while(true)循环)
您应该检查支持异步IO操作的AsynchronousSocketChannel和AsynchronousServerSocketChannel类。为了能够使用这些类,您必须更改大多数客户端服务器通信逻辑。
请查看以下链接,以获取这些类的详细信息和示例用法。
https://www.javaworld.com/article/2853780/socket-programming-for-scalable-systems.html