2014-12-04 54 views
0

因此,這裏是我的客戶怎麼樣子:客戶端的Socket停留在用戶輸入

Socket socket = new Socket("localhost", 1234); 
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 

while (true) { 
    String userInput = stdIn.readLine(); 
    if (userInput != null) { 
     String message = username + ":" + userInput + "\n"; 
     out.println(message); 
     out.flush(); 
    } 

    String serverMessage = in.readLine(); 
    if (serverMessage != null){ 
     System.out.println(serverMessage); 
    } 
} 

客戶有權監聽用戶的輸入,發送給其他客戶端,並具有監聽其他客戶端的消息。這段代碼確實如此,但會停留在監聽用戶輸入的第一行。有什麼解決方法嗎?

+0

它被卡在「String serverMessage = in.readLine();」?正確? – Khanna111 2014-12-04 06:12:14

+0

@ Khanna111GauravKhanna是 – Marijus 2014-12-04 06:18:58

+0

如果'readLine()'返回null,則需要對它做些什麼。這意味着對等關閉了連接,所以您必須(1)退出此循環並(b)關閉套接字。目前您將無限期地循環播放。 – EJP 2014-12-04 07:06:59

回答

1

,它被卡住的原因是,它等待讀取從另一端發送到該行。沒有任何東西會被卡住。

爲了如果它沒有數據即將它不會被卡住,你可以設置一個套接字超時。請注意,套接字仍然有效。那就是:

socket.setSoTimeout(200); // Add this below the socket creation line. Timeout of 200 ms. 

而且

try { 
    String serverMessage = in.readLine(); // it will timeout in 200 ms 

    if (serverMessage != null) { 
     System.out.println(serverMessage); 
    } 
} catch (SocketTimeoutException e) 
    // log 
} 

請更新超時無論是必需的,但一定要確保它不是,它會循環像瘋了似的太少。希望這可以幫助。