私は、受信UDPブロードキャストメッセージの特定のポートでリッスンする必要があるクライアントを持っています。これは、ポートにバインドされたDatagramSocketオブジェクトを1500msのsetSoTimeoutで初期化することで実現します。ネットワーク負荷が高い状態でJava DatagramSocketが応答を停止する
while (true) {
try{
DatagramSocket datagramSocket = new DatagramSocket(PORT);
byte[] buffer = new byte[BUFF_LEN];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
datagramSocket.receive(packet);
[handoff packet to internal buffer to await processing]
} catch (SocketTimeoutException timeout) {
...
} catch [other exceptions]
}
これはきれいな教科書であり、すべて正常に機能します。最近のネットワーク負荷テストでは、アプリケーションが特定のデータグラムを受信していないことが判明し、ネットワークが混雑するほど問題は悪化しました。
さらに掘り下げると、.receive()が呼び出されるたびにタイムアウトが発生していることが判明しました。ほとんどの場合、ポートに何も到着していないかのようです。 しかし、同じマシン上でWiresharkを実行すると、これは真ではないことがわかります、期待どおりのサイズと内容の整形済みパケットがいつものように到着しています。何とかデータグラムがアプリケーション層への道を見いださなかっただけです。
ネットワークトラフィックが急激に減少すると、この問題は直ちに解消され、Javaアプリケーションはすぐに通常通りにパケットを受信して処理できます。
誰でも問題が発生している可能性がありますか、この問題のトラブルシューティングをさらに進めるにはどうすればよいですか?
ありがとうございます。
wiresharkが受信データをうまく記録している場合でも、これは可能ですか? 私の場合と同じ問題を抱えているのは、グーグルの時間が1人にすぎないからです。 http://social.technet.microsoft.com/Forums/en/winserverTS/thread/06a33876-fb45-4bfe-90c2-d27a27e48e3f – Gary
正直言ってわかりません。あなたは、ドライバー、薄いネットワークカード、面白いOSのリビジョン、または何かを実行している可能性があります。 Wiresharkがどのようにデータを実際に読み取るかを知らないと、負荷に関連して再現性があると判断して、ファイアウォールやスロットルソリューションの可能性が高いと思います。 – mcfinnigan