我目前正在編寫多個客戶端將連接到的服務器。通信協議基本上是服務器向客戶端發送任務,客戶端在任務執行時響應。客戶端保持連接到服務器,不應斷開連接。使用執行器代替服務器套接字客戶端的新線程
目前我開始一個新的線程來處理每個客戶端。在精神我目前的解決方案是這樣的:(來源從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的客戶端。所以,如果我在什麼地方客戶的的CopyOnWriteArrayList客戶端,然後在服務器類是這樣的:
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,以便將命令發送到所有客戶端,並且還刪除不連接的。這是一個強大的解決方案嗎?如果可執行文件由於某種原因會向其傳播異常,那麼Executor會發生什麼情況?
您在混合客戶端和服務器。在你的情況下,客戶端是服務器,反之亦然。 – ahanin 2012-04-05 19:21:37
@ahanin我同意這不是完全清楚,但我認爲這是*最*正確的描述。由於客戶端連接到服務器(它具有ServerSocket),因此它變成了每個定義的服務器:) – Teletha 2012-04-05 19:38:28
我沒有困惑,我完全理解了什麼是意圖,我只是想指出@Teletha正在混淆概念。在所描述的情況下,客戶端是一種提供「服務器」請求來執行任務的工作者代理。 – ahanin 2012-04-05 19:52:01