我从我的教授那里得知,使用UDP套接字发送的数据报包在较低层中被分段,可能在接收端以多个包的形式到达。例如,如果我在数据报包中发送1000字节数据,则在接收端可能到达,比如说2个字节,500个字节,12个字节,依此类推。因此,他建议多次接收(...)接收发送方发送的整个1000字节的数据包。
后来当我浏览数据报套接字接收(...)的Java文档时,有一行读取如下:“此方法阻塞,直到收到数据报。...”这是否意味着整个数据报我们使用Java时收到数据包并且不需要进行多次接收(即使理论上是这种情况)?
PLS。澄清。如果每个数据包的多次接收(...)是解决此问题的唯一选择,请参阅。提出如何做到这一点的建议。
答案 0 :(得分:4)
对receive()
的任何调用都会给你一个完整的数据包 - 片段处理发生在套接字下面的两层。碎片和碎片整理发生在网络/ Internet层(IP)中,因此套接字永远不会看到碎片,只接收完整和完整的UDP / TCP数据包(只有完整的数据包才会被发送到监听端口)。
所以,不,你不需要多个receive()
来获取单个数据包,但你应该知道UDP不可靠,所以如果一个片段在网络层中丢失(在某些情况下,如果它到达无序),你将无法获得数据包。
如果您在接收数据包时遇到问题,可能还需要检查方法getReceiveBufferSize()
和setReceiveBufferSize()
- 如果缓冲区大小小于数据包大小,则无法保证您可以接收数据包分组。