簡體   English   中英

Java:正確關閉多線程服務器的套接字

[英]Java: properly closing sockets for multi threaded servers

我正在嘗試創建一個多線程服務器,多個客戶端可以連接到該服務器並可以為其提供服務。 但是,如果需要,我不確定如何正確釋放我的資源。

我的服務器運行一個輸入線程(等待用戶輸入)和一個處理線程(處理連接和用戶)。 我在服務器類中打開一個 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? 如果是這樣,是否有一種簡單的方法可以做到而不是將與服務器的每個連接都保存在某處?

關閉 ServerSocket 是否會隱式關閉使用它創建的 ClientSockets?

不,這對他們沒有影響。

或者我應該確保手動關閉每個打開的 ClientSocket?

是的,無論如何您都應該在每個處理程序線程中這樣做。

如果是這樣,是否有一種簡單的方法可以做到而不是將與服務器的每個連接都保存在某處?

只需施加讀取超時並關閉超時的每個套接字。 這是任何服務器的正常部分。 您不必收集套接字或對其采取任何特殊措施來關閉。

不,它沒有。 它只是關閉ServerSocket意味着無法建立新連接。 現有的開放套接字仍將繼續工作。

沒有“簡單”的方法可以關閉所有打開的套接字,因為開始並不難(或者,如果您發現這是網絡編程中的難點,那么會發生一些非常奇怪的事情)。

讓客戶端處理程序線程在處理結束時關閉客戶端套接字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM