【发布时间】:2012-04-05 19:18:24
【问题描述】:
我目前正在编写一个服务器,多个客户端将连接到该服务器。通信协议基本上是服务器向客户端发送任务,客户端在执行任务时响应。客户端保持与服务器的连接,并且永远不应断开连接。
目前我正在启动一个新线程来处理每个客户端。在精神上我目前的解决方案是这样的:(来自Java Concurrency in practice)
public class ThreadPerTaskWebServer {
public static void main(String[] args) throws IOException {
ServerSocket socket = new ServerSocket(80);
while (true) {
final Socket connection = socket.accept();
Runnable task = new Runnable() {
public void run() {
handleRequest(connection);
}
};
new Thread(task).start();
}
}
private static void handleRequest(Socket connection) {
// request-handling logic here
}
}
但我想使用 Executor,因为它们看起来更稳定且可扩展性更好。因此,为了让服务器能够向客户端发送消息,我需要将客户端与运行它们的 Executor 分开跟踪。因此,如果我将客户端放在 CopyOnWriteArrayList 客户端中的位置,然后在 Server 类中有类似的内容:
Socket clientSocket = serverSocket.accept();
// The runnable that takes care of a client
ClientHandler c = new ClientHandler(clientSocket, this);
// Start executing the ClientHandler
exec.execute(c);
// Add clients to CopyOnWriteArrayList
clients.add(c);
这将允许我遍历 CopyOnWriteArrayList 以便向所有客户端发送命令并删除断开连接的客户端。这是一个强大的解决方案吗?如果一个 runnable 出于某种原因会向其传播异常,那么 Executor 会发生什么?
【问题讨论】:
-
您混淆了客户端和服务器。在您的情况下,客户端是服务器,反之亦然。
-
@ahanin 我同意这不是很清楚,但我认为这是最正确的描述。由于客户端连接到服务器(并且它具有 ServerSocket),因此根据定义它成为服务器:)
-
我并不困惑,我完全理解其意图,我只是想指出@Teletha 正在混淆概念。在所描述的情况下,客户端是一种为“服务器”请求执行任务的工作代理。
-
你是对的@ahanin。我浏览了第一段。对不起。
标签: java multithreading serversocket executor executors