2014-04-09 50 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