1

データグラムソケットを開き、他のさまざまなプロセスに送信するアプリケーションがあります....時々、このアプリケーションは、ネットワーク通信も行う別のプロセスを(ProcessBuilderを使用して)起動します...

さて、ジョークは、起動されたプロセスが「時々」メインアプリケーションが終了した後にのみメッセージを受信することです...または、Xに送信することもありますが、メインアプリケーションが停止したときにのみ配信されます...

私は何が起こっているのか見当もつきません...誰かこのようなことを聞​​いたことがありますか? プロセスが停止しているときにのみパケットが送信されますか?

4

4 に答える 4

2

Java でソケットを使ってプログラミングするのは久しぶりですが、すべてのデータを「強制的に」送信するにはソケットを明示的にフラッシュする必要があることを覚えています。これは、ソケットを閉じたときに行われます。これにより、観察された動作が説明されます。

于 2009-12-10T21:15:29.727 に答える
0

子プロセスは または に書き込んでいますSystem.outSystem.err? 子プロセスが開始されたら、これらのストリームを排出するようにメイン プロセスを設定しましたか? 子プロセスが、読み取られていないブロッキング ストリームにログ メッセージを出力しようとしてデッドロックしている可能性があります。親アプリが強制終了されると、ストリームのブロックが解除され、すべてが再び動き始めます。大当たりかもしれませんが、私は常にチェックしている子プロセスを開始するときに十分に噛まれてきました。

于 2009-12-10T21:40:33.690 に答える
0

あなたは見ましたsocket.setTcpNoDelay(true);か?

これは、一定量のデータが収集されるのを待ってからネットワーク経由で送信する最適化です。散発的で少量のデータを送信するアプリケーションの場合、これはオフに設定する必要があります。

編集: 申し訳ありませんが、これは非データグラム ソケット専用だと思います。おそらくあなたの問題ではありません。

于 2009-12-10T21:26:34.013 に答える
0

1 つの可能性は、これがデータグラムを使用した結果であるということです。データグラムは本質的に信頼性が低く、パケットがドロップされたり、順不同で配信される可能性があります。

アプリケーションの終了が早すぎる可能性もあります。アプリケーションと起動されたプロセスがハンドシェイクを行って、両方がいつシャットダウンするかを確実に認識していますか?

編集:

しかし実際には、親プロセスが子の出力に書き込まれたものを読み取らないため、子プロセスがブロックされている可能性が最も高いと思います...手遅れになるまで。実験として、子プロセスの起動に次を追加します。

OutputStream os = new FileOutputStream(...); // pick a suitable temp filename
System.setOut(os);
System.setErr(os);

このハックで問題が解決する場合は、これが根本的な問題であることを示しています。

于 2009-12-10T21:27:52.530 に答える