我正在嘗試創建多線程服務器,以便多個客戶端可以連接並可以接受服務。但是,如果需要,我不確定如何正確釋放我的資源。Java:正確關閉多線程服務器的套接字
我的服務器運行一個輸入線程(等待用戶輸入)和一個處理線程(處理連接和用戶)。我在服務器類中打開一個ServerSocket並將其傳遞給我的處理線程。它看起來像這樣:
public class ClientConnector implements Runnable {
private ServerSocket serverSocket;
public ClientConnector(ServerSocket serverSocket) {
this.serverSocket = serverSocket;
}
@Override
public void run() {
ExecutorService tcpExecutor = Executors.newCachedThreadPool();
while (!serverSocket.isClosed()) {
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("could not accept connection");
}
if (clientSocket != null) {
tcpExecutor.execute(new ClientHandler(clientSocket);
}
}
}
}
如果我要退出,我只是在我的服務器類運行這個方法來關閉的ServerSocket:
public void exit() {
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
這應該引起接下來的ServerSocket.accept()調用拋出異常,並且由於套接字關閉,循環停止。
我的問題是 - 是否關閉ServerSocket隱式關閉使用它創建的ClientSockets?或者我應該確保手動關閉每一個打開的ClientSocket?如果是這樣的話,有沒有一種簡單的方法可以做到這一點,而不是保存每一個連接到服務器的連接?
問題是,在我們關閉服務器套接字時偶然發生的任何套接字都打開,因爲它們被阻塞等待來自客戶端的輸入。他們是一種奇怪的封鎖,甚至不能被打斷。即使發送一個空數據包以解除阻塞套接字的技巧也不行,因爲它們正在等待與第三方建立的連接,因此您無法在這些連接中插入空數據包。那麼,你有沒有找到解決辦法? –