2011-12-08 36 views
5

我有一個Java程序不斷從外部系統發送UDP數據。如何「清除」Java DatagramSocket上的接收緩衝區?

定期地,我們需要停止接收數據(因爲另一臺機器正在處理它)。在那段時間,我的套接字閱讀器線程進入睡眠循環。當是開始接收數據包的時候,我再次進入socket.receive(Packet),並且擁有一個緩衝區滿了數據包,我應該而不是正在處理。 (數據來,而在「停止時間」。)

有沒有辦法來清除一個DatagramSocket的緩衝?

如果不是,那麼最好的選擇是什麼?當我進入等待狀態時將緩衝區大小設置爲0,並在我開始再次服務數據包時將其恢復?當我等待時,關閉套接字,當我回來時打開一個新的套接字?

回答

4

而不是具有插座上的停機時間,對任何代碼處理這些分組的停機時間。

所以插座繼續獲得像通常那樣,但如果它的停工期,它只是立即丟棄該數據包。

不完全是最有效的解決方案,但它真的很容易實現,併爲它的葉子在其他情況下,在不同時間接受不同類型的數據包的開放節點可能是有用的。

+0

我喜歡它。無論如何,機器都會獲取數據,而實際的套接字IO比較便宜(如果正確完成:-)。然而,似乎這仍然可能導致與「停止時間」和「其他機器」的比賽條件,除非在包中有確定誰應該處理它們的額外信息... – 2011-12-08 23:41:53

+0

@pst假設數據包有某種類型識別有關它們的信息,然後無論什麼信號將其關閉應該能夠告訴它「在ID 1400000之後不接受數據包」或其他東西。這具有額外的優勢,即使延遲了1399999處理,並且在殺死信號被擊中後到達節點。 – corsiKa

+0

@pst是的,有這種競爭條件。幸運的是,切換很少發生(它是集羣的一部分,當主服務器關閉時我們需要進行熱備份)。在這段時間內丟失一點數據是可以接受的(確切的正確性不是必需的,但我們希望保持儘可能準確,絕對不要過分計數)。 –