2013-03-15 37 views
1

大家好日子!是否需要在java UDP服務器實現中存儲傳入消息?

我正在開發基於Java NIO的簡單Java UDP服務器。 Here我讀過,我必須將所有傳入的消息存儲在某個緩衝區中,並以某種方式識別換行符。但是,如果傳入消息的大小始終爲< =緩衝區大小,我是否需要存儲以前的狀態?我的意思是我的ByteBuffer足夠大以存儲任何傳入的消息。是否有些情況下,確保自己處理一些像monolit這樣的消息更好,而他們只是一些重要消息的一部分?我只是不想做頭腦工作,並且想要精確地分配足夠大的緩衝危險策略與否。

回答

1

您引用的問題是關於TCP通道,它與您正在使用的UDP通道不同。 (即,TCP層中沒有「消息」; TCP是單個字節流,並且在「消息」中拆分流是該應用的關注)。應用程序必須處理字節流並提取消息。主機可以寫入一些字節到TCP通道,然後寫入更多的字節;另一個主機不能確定它們是以兩種(或多種)不同的操作寫入,還是隻寫入一種。另一臺主機只按照它們發送的順序讀取字節。

另一方面,UDP是面向數據報的:您從一臺主機發送一些字節(數據報),另一臺主機接收該數據報。數據報既不合並也不拆分(但可能會丟失)。 DatagramChannel.read將返回恰好一個數據報。如果每條消息都符合UDP數據報,則不需要保留緩衝區。

但是,如果您有幾個UDP數據報中發送的消息,則需要一個緩衝區才能重建原始消息。你還需要注意消息順序(因爲UDP數據報可能會被網絡重新排序)和丟失的數據報(因爲UDP是not reliable

+0

你能準確地發送一些短消息就等於發送1數據報嗎?即使這條消息很短,客戶端計算機是否可以將我的消息分成幾個數據報? – Baurzhan 2013-03-15 04:52:51

+0

對'DatagramChannel.send'的調用只發送**一個數據報**,並且不會被客戶機分割。 – Javier 2013-03-15 04:55:49

+0

實際上,我並沒有在客戶端使用DatagramChannel.send - 它是一些配置爲通過UDP協議將消息發送到某個IP地址的設備。我不知道它是如何在內部向我發送消息的。它似乎是測試它的唯一方法是分析來自此設備的日誌) – Baurzhan 2013-03-15 04:58:54

相關問題