2014-04-09 205 views
0

在大多數Java客戶端/服務器檢查中,他們使用ServerSocket.accept()方法從客戶端接收消息。此方法阻止該線程。這看起來不錯,因爲服務器不做無用的工作,可以立即回答。但在客戶端,他們使用無限循環這樣的:Java上的客戶端套接字

BufferedReader in = new BufferedReader (new InputStreamReader (socket.getInputStream())); 
while (true) 
{ 
    String cominginText = ""; 
    try 
    { 
     cominginText = in.readLine(); 
     System.out.println (cominginText); 
    } 
    catch (IOException e) 
    { 
     //error ("System: " + "Connection to server lost!"); 
     System.exit (1); 
     break; 
    } 
} 

這很糟糕,因爲在我的腦海客戶做無用功。 有沒有辦法在客戶端接收消息,而沒有做無用的工作,並立即在服務器端(可能應該使用監聽器?)

「你是什麼意思的無用的工作? - Braj 31分鐘前」

例如在循環檢查是按下的按鈕(我們應該使用監聽器)

while (!button.isPressed()) { }是不錯的方法。

+1

'in.readLine()'塊在客戶端嗎? – mellamokb

+0

'ServerSocket.accept()'方法不用於接收來自客戶端的消息。它等待有人接受插座。輸入/輸出流用於消息通信。 – Braj

+0

「無用的工作」是什麼意思? – Braj

回答

0

沒有「無用功」在這裏,因爲套接字處於阻塞模式,但有:

  1. 「comingText」的毫無意義的初始化。
  2. 未能檢查它是否爲null,因此它會在EOS中無意識地旋轉。
  3. IOExceptions的處理不正確:並非所有的都是致命的,例如, SocketTimeoutException,並且它們都不會導致立即System.exit()。
  4. 行讀取被丟棄,這是一個應用程序協議錯誤。

所以這是絕對錯誤的。

0

in.readLine() blocks。循環不會繼續下去,直到一個字符串返回

+0

不是*消息*,a *行*。 – m0skit0

+0

@ m0skit0如果你想獲得技術,這是一個字符串,而不是一條線。一條線不是Java中的一種類型。 –

+0

它如何知道一個字符串已完成? – m0skit0