5
我有一個Java程序不斷從外部系統發送UDP數據。如何「清除」Java DatagramSocket上的接收緩衝區?
定期地,我們需要停止接收數據(因爲另一臺機器正在處理它)。在那段時間,我的套接字閱讀器線程進入睡眠循環。當是開始接收數據包的時候,我再次進入socket.receive(Packet)
,並且擁有一個緩衝區滿了數據包,我應該而不是正在處理。 (數據來,而在「停止時間」。)
有沒有辦法來清除一個DatagramSocket的緩衝?
如果不是,那麼最好的選擇是什麼?當我進入等待狀態時將緩衝區大小設置爲0,並在我開始再次服務數據包時將其恢復?當我等待時,關閉套接字,當我回來時打開一個新的套接字?
我喜歡它。無論如何,機器都會獲取數據,而實際的套接字IO比較便宜(如果正確完成:-)。然而,似乎這仍然可能導致與「停止時間」和「其他機器」的比賽條件,除非在包中有確定誰應該處理它們的額外信息... – 2011-12-08 23:41:53
@pst假設數據包有某種類型識別有關它們的信息,然後無論什麼信號將其關閉應該能夠告訴它「在ID 1400000之後不接受數據包」或其他東西。這具有額外的優勢,即使延遲了1399999處理,並且在殺死信號被擊中後到達節點。 – corsiKa
@pst是的,有這種競爭條件。幸運的是,切換很少發生(它是集羣的一部分,當主服務器關閉時我們需要進行熱備份)。在這段時間內丟失一點數據是可以接受的(確切的正確性不是必需的,但我們希望保持儘可能準確,絕對不要過分計數)。 –