【发布时间】:2012-01-05 05:50:46
【问题描述】:
情况是有 4 个“助手”线程,每个线程都与所有助手(包括其自身)连接。我确实在自动冲洗。下面,this.id 是一个 int,用于标识运行代码的助手。在调试中,我看到助手 0 向自己发送一条消息(通过所有连接发送),但是当它应该接收消息时(通过连接 0),它的行为就像它的 BufferedReader 有一个空缓冲区。
已解决:糟糕,我有一个设计缺陷。我确保每个助手只为每个助手保留一个需要与之通信的套接字,但是当助手连接到自己时这是不正确的。在这种情况下,只保留一个套接字意味着通信的另一个端点(与自身)丢失。
我的程序在这里永远旋转(必须是空缓冲区):
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);
}
如果需要套接字设置代码,请告诉我,我会添加它。
【问题讨论】: