2011-11-23 58 views
0

情况是有4个'Helper'线程,每个线程都有一个连接到所有helpers(包括它自己)的线程。我确实是自动翻版。下面,this.id是一个int值,用于标识运行代码的助手。在调试中,我看过帮助程序0向自己发送消息(通过发送所有连接),但是当它应该接收消息(通过连接0)时,它的行为就像它的BufferedReader有一个空缓冲区。BufferedReader没有通过套接字接收消息

解决:Woops我有一个设计缺陷。我确保每个助手每个助手只保留一个需要与之通信的套接字,但是当助手连接到自身时这是不正确的。在这种情况下,只保留一个套接字意味着另一个通信端点(本身)丢失。

我的程序在这里永远自旋(必须是空的缓冲液):

 boolean clientStreamReady = false; 
     boolean helperStreamReady = false; 
     while (!(clientStreamReady || helperStreamReady)) { 
      clientStreamReady = this.inFromClient.ready(); 
      helperStreamReady = this.helperIns.get(this.id).ready(); 

      if (clientStreamReady) { 
       message = this.inFromClient.readLine(); 
      } 
      else if (helperStreamReady){ 
       message = this.helperIns.get(this.id).readLine(); 
      } 
     } 

该消息是“广播”这里:

for (PrintWriter out : this.helperOuts) { 
     out.println(this.id + "," + kind + "," + this.clock.getTime()); 
    } 
从插座

的IO,之前建立到以上,都是在这里完成:

for (Socket socket : this.helperSockets) { 
      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

      this.helperOuts.add(out); 
      this.helperIns.add(in); 
    } 

如果需要插槽设置密码告诉我,我会添加它。

回答

1

您的PrintWriters是否启用了自动刷新功能?如果没有,那么在广播循环结尾处的一个简单的out.flush()可能已经成功了。

+0

是的,我愿意。好的建议,但不设置自动冲洗让我几次之前。 – Rooster

相关问题