簡體   English   中英

Java服務器 - 多客戶端TCP連接I / O.

[英]Java server-multi-client TCP connection I/O

我在這里找不到類似的帖子,所以這里是:

當我啟動服務器和幾個客戶端時,我希望所有客戶端上的用戶能夠輸入要處理的數據。 此外,我希望服務器能夠在所有客戶端會話終止后退出監聽循環。

服務器代碼監聽循環:

//Console console = System.console();
// or 
//InputStreamReader str = new InputStreamReader(System.in);
//BufferedReader uinp = new BufferedReader(str);

// ...

try (ServerSocket serverSocket = new ServerSocket(portNumber)) { 
    while (listening) {
        new SocketServerThread(serverSocket.accept()).start();

        //String serverInput = console.readLine("> ");
        //if ( serverInput.equalsIgnoreCase("exit") ) { listening = false; }
        // or
        //System.out.print("> ");
        //if ( (uinp.readLine()).equalsIgnoreCase("exit") ) { listening = false; }
    }
} catch (IOException e) {
    System.err.println("Could not listen on port " + portNumber);
    System.exit(-1);
}

這是事情:1)如果我編碼服務器能夠接收輸入並處理它(如“退出”字符串告訴服務器退出監聽循環), 在我看來 ,第二個客戶端的線程不會跑,我覺得很奇怪。 2)如果我不對服務器進行編碼以便能夠退出監聽循環,那么服務器如何以用戶的意願退出循環?

正如您所看到的,我嘗試過(a)控制台和(b)InputStreamReader和BufferedReader,但它們都沒有工作。

所以, 我的問題是:如何讓服務器以用戶的意願退出監聽循環並允許第二個客戶端的線程同時運行?

我認為你已經混淆了客戶端服務器架構的目的。
服務器是客戶端可以連接並請求一個或多個服務集中式系統 那么你所說的是你想要停止集中式系統,即服務器 ,還是讓其他客戶端繼續運行? 這是不可能的。 因為沒有服務器就不能存在客戶端(如果它首先沒有服務器就不會被稱為客戶端)

因此,如果您退出服務器的監聽循環,則沒有客戶端可以連接到它。 因此,不能執行客戶端線程。 如果您希望所有服務器 - 客戶端會話都根據客戶端用戶的意願終止。 你可以做一個解決方法。

在服務器端保留count變量。 隨着每個新客戶端的增加而減少客戶端的減少。 另外,保留一個布爾變量,例如在服務器端再次使用false初始化的toClose 現在讓我們說客戶端'A'告訴服務器關閉(就像你已經完成的“退出”命令),你將toClose的值更改為true。
現在在每個客戶端的會話結束時,您檢查以下內容:

if (toClose == true && count <=0 )
    exitListeningLoop()

暫無
暫無

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

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