Javaで簡単なアプリケーションを書いた。そこには2つのノードがあり、それぞれに着信接続をリスンするポートに対してServerSocketが開いている。ノードはそれぞれ2つのスレッドを実行し、最初のメッセージの送信時に作成された永続的なTCPソケットを介して他のノードに1000のメッセージを送信します。ただし、ノードはすべて1000のメッセージを受信しません。 1つは850を受け取り、もう1つは650を受け取ります。この数は、複数の実行で一定に保たれる傾向があります。Java:複数のスレッド対ソケット
public void SendMsg(String dest, Message myMsg) {
Socket sendsock = null;
PrintWriter printwr = null;
try {
if(printwr == null) {
sendsock = new Socket(dest, Main.rcvport);
printwr = new PrintWriter(sendsock.getOutputStream(), true);
}
String msgtosend = myMsg.msgtype.toString() + "=" + Main.myaddy + "=" + myMsg.content + "\n";
printwr.print(msgtosend);
} catch (UnknownHostException ex) {
System.out.println(ex);
//DO: Terminate or restart
} catch (IOException ex) {
System.out.println(ex);
//DO: Terminate or restart
}
}
パフォーマンスは私が buffwr =新しいBufferedWriterの(printwr)にも を使用する場合は改善し、buffwr.writeを使用しているようだ(...):
送信するコードは以下の通りです。 printwr.print(...)の代わりに、データ損失の完全な解決策ではありません。パケットが配信されなかったことを示す例外はないので、送信者に応じて、すべて正常に送信されました。
次のように受信側では、受け入れられた接続が処理されます。
BufferedReader inbuff = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
while(running) {
String rcvedln = inbuff.readLine();
if(rcvedln != null) {
count++;
System.out.println(count);
}
}
が問題を引き起こしている可能性があり、読者と作家が使用されている方法に問題はありませんか?ありがとう。
+1、おそらく、メッセージは送信側でフラッシュされません。 printwr.flush(); – akarnokd
私はSendWriterをSendWsに保存するので、SendMsg(...)が呼び出されるたびに、それを閉じずに同じPrintWriterを何度も使用しています。フラグがtrueに設定されているため、自動的にフラッシングする必要があります。 –
SendMsg()が呼び出されるたびにコードが新しいSocketとPrintWriterをインスタンス化しているように見え、どちらもメソッドの完了時に閉じられていません。 – Andrew