【发布时间】:2013-09-16 03:53:06
【问题描述】:
我正在尝试使用线程池开发 Java 聊天服务器,但我不知道如何处理来自客户端的传入消息。我考虑将每个套接字连接保存在哈希图中并将任务添加到线程池队列中。但是服务器如何知道他何时从客户端接收消息而不实例化缓冲读取器?
【问题讨论】:
标签: java chat threadpool
我正在尝试使用线程池开发 Java 聊天服务器,但我不知道如何处理来自客户端的传入消息。我考虑将每个套接字连接保存在哈希图中并将任务添加到线程池队列中。但是服务器如何知道他何时从客户端接收消息而不实例化缓冲读取器?
【问题讨论】:
标签: java chat threadpool
您不需要为每个套接字初始化一个缓冲读取器。您可以查看一下是否有数据等待读取。
for(Socket socket : socketsList)
if(socket.getInputStream().available() > 0) {
// you have data to be read from this socket
}
【讨论】:
您的服务器将需要使用代理对象,这些代理对象包含从其套接字读取的 BufferedReader。也许您需要创建这些代理对象的集合。
例如,
class ServerAgent implements Runnable {
private OutputStream out;
private BufferedReader br;
public ServerAgent(Socket clientSocket) throws IOException {
out = clientSocket.getOutputStream();
br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// ....
}
@Override
public void run() {
// TODO finish code that reads from br, BufferedReader
}
}
您的服务器可能有如下代码:
while (true) {
Socket clientSocket = server.accept();
futureList.add(threadPoolExector.submit(new ServerAgent(clientSocket)));
}
【讨论】: