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);
}
如果需要插槽設置密碼告訴我,我會添加它。
是的,我願意。好的建議,但不設置自動沖洗讓我幾次之前。 – Rooster