![](/img/trans.png)
[英]How does DatagramSocket receive packet everytime and does not stuck
[英]Datagramsocket: how receive(…) handles fragmentation of a packet
我從我的教授那里得知,使用UDP套接字發送的數據報包在較低層中被分段,並且可能在接收器端以多個數據包的形式到達。 例如,如果我在數據報包中發送1000字節數據,則在接收端它可能會以2字節,500字節,12字節等形式到達。 因此,他建議多次接收(...)接收發送方發送的整個1000字節的數據包。
后來當我瀏覽數據報套接字接收(...)的Java文檔時,有一行讀取如下:“此方法阻塞,直到收到數據報。...”是否表示收到整個數據報包當我們使用Java時,不需要進行多次接收(即使理論上是這種情況)?
PLS。 澄清。 如果每個數據包的多次接收(...)是解決此問題的唯一選擇,請參閱。 提出如何做到這一點的建議。
對receive()
任何調用都會給你一個完整的數據包 - 片段處理發生在套接字下面的兩層。 碎片和碎片整理發生在網絡/ Internet層( IP )中,因此套接字永遠不會看到碎片但只接收完整和完整的UDP / TCP數據包(只有完整的數據包才會被發送到監聽端口)。
所以,不,你不需要多個receive()
來獲取單個數據包,但是你應該知道UDP不可靠,所以如果一個片段在網絡層中丟失(在某些情況下,如果它不按順序到達) ,你將無法獲得數據包。
如果您在接收數據包時遇到問題,您可能還需要檢查方法getReceiveBufferSize()
和setReceiveBufferSize()
- 如果緩沖區大小小於數據包大小,則無法保證您可以接收數據包。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.