情况是有4个'Helper'线程,每个线程都与所有helper(包括它自己)连接。我确实是自动冷却。下面,this.id是一个用于标识运行代码的帮助程序的int。在调试中,我看过帮助器0向自己发送消息(通过发送所有连接),但是当它应该接收消息时(通过连接0),它的作用就像它的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);
}
如果需要套接字设置代码,请告诉我,我会添加它。
答案 0 :(得分:1)
您的PrintWriters是否启用了自动刷新功能?如果没有,广播循环结束时的简单out.flush()可能已经成功了。