2011-11-23 76 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