我在Java中的多線程TCP服務器,它允許從多個客戶端的連接,並開始一個新的ServerThread每個連接的客戶端中斷服務線程特定的超時,客戶端關閉其套接字。我如何中斷與客戶端連接的ServerThread? clientsocket.isClosed()
和!clientSocket.isConnected()
由於某種原因不起作用。當客戶端關閉TCP連接
最後,我把它用下面的代碼片段工作(解決辦法是在資源塊的插座和無盡in.readLine() == null
):
服務器類
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
// Create a new thread for each incoming connection.
Socket clientSocket = serverSocket.accept();
ServerThread serverThread = new ServerThread(clientSocket, this);
serverThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ServerThread類:
public void run() {
try (Socket socket = clientSocket; // Enable auto-close for socket...
PrintWriter out = ...; BufferedReader in = ...;) {
...
while (!clientSocket.isClosed() && !isInterrupted()) {
if (in.readLine() == null) {
break;
}
}
System.err.println("Client with port " + clientSocket.getPort() + " closed connection to server.");
} catch (IOException e) {
e.printStackTrace();
}
}
客戶端類:我使用與ServerThread類中的資源塊相同的嘗試
1.您根本沒有多線程服務器。你應該調用'serverThread.start()',而不是'serverThread.run()'。目前你根本沒有創建任何真正的線程。 2. isClosed()和isConnected()方法告訴你有關你的套接字的狀態,而不是關於連接的狀態。當對方斷開連接時,它們不會奇蹟般地變爲虛假。 3.你不需要中斷ServerThread。在這種情況下從套接字讀取返回流的結束:你在測試嗎? – EJP
但是,如果我不中斷ServerThread,一段時間後會有大量的ServerThreads。 – jannnik
線程本身在讀取時識別流結束,或在寫入時識別IOException,或者讀取超時,並關閉它們的套接字並退出。這就是所有Java阻塞模式服務器的工作原理。您需要閱讀Java教程的自定義網絡部分。 – EJP