2011-12-08 17 views
5

私は常に外部システムからUDPデータを送信されるJavaプログラムを持っています。Java DatagramSocketで受信バッファを "クリア"するには?

定期的に、データの受信を停止する必要があります(別のマシンがそれを処理しているため)。その間、私のソケットリーダースレッドはスリープループに入ります。パケットの受信を開始するときは、もう一度socket.receive(Packet)に行き、パケットがいっぱいのバッファを持っていなければなりません。ではなく、が処理されます。 (データは「停止時間」に入っています)

DatagramSocketのバッファをクリアする方法はありますか?

もしそうでない場合、最良の選択肢は何ですか?私が待ち状態に入ったときにバッファサイズを0に設定して、パケットを再びサービスするときに戻しますか?私が待っている間にソケットを閉じて、私が戻ったときに新しいものを開きますか?

答えて

4

ソケットにダウンタイムを設けるのではなく、どのようなコードでもパケットを処理するためにダウンタイムが発生します。

したがって、ソケットは通常通りに受信し続けますが、ダウンタイムになった場合はすぐにパケットを破棄します。

正確には最も効率的な解決策ではありませんが、実際には実装が簡単で、異なる時期に異なるタイプのパケットを受け入れるためにノードを開いたままにしておくと便利です。

+0

私はそれが好きです。とにかくマシンはデータを取得しますが、実際のソケットIOは比較的安いです(正しく実行された場合:-)。しかし、パケットに何らかの種類があると仮定して、誰がパケットを処理すべきかを決定するための追加情報がない限り、これは "停止時間"と "他のマシン"との競合状態を引き起こす可能性があります。 –

+0

それらについての情報を識別するには、それをオフにするどんな信号であれ、それは "それはID 1400000の後のパケットを受け入れない"か何かを伝えることができるはずです。これは、たとえそれが遅れても1399999が処理され、キル信号がヒットした後にノードに到達するという追加の利点があります。 – corsiKa

+0

@pstはい、競合状態があります。幸いにも、スイッチオーバーはごくまれに発生します(クラスタの一部であり、プライマリがダウンしてホットバックアップに移行する必要がある場合に起動されます)。これらの時間中に少しのデータを失うことは許容されます(正確さは必要ありませんが、可能な限り正確に保ち、​​過度にカウントしたくはありません)。 –

関連する問題