use*_*813 2 java networking udp network-programming datagram
我已经阅读了一些有关UDP/Java数据报通道如何运作的相互矛盾的事情.我需要了解一些事情:
UDP是否具有继承方式来判断在.read(ByteBuffer b)之前是否按顺序接收整个数据包?我读过至少一篇文章说UDP继承'丢弃不完整或乱序数据.
datagramchannel是否将一个send(buffer ..)视为一个数据报包?如果是部分发送怎么办?
.read(..)是否可以读取多个数据包,如果作为命令参数给出的缓冲区仅用于处理一个数据包,则会导致数据被丢弃?
UDP是否有[固有的]方法来判断在.read(ByteBuffer b)被调用之前是否按顺序接收的数据包?我读过至少一篇文章说UDP继承'丢弃不完整或乱序数据.
这两种说法都不正确.更确切地说,IP有一种方法可以判断数据报的片段是否全部到达,然后只有这样才能将它呈现给UDP.重组是IP层的责任,而不是UDP.如果片段没有到达,UDP甚至从未看到它.如果它们在重组完成之前到期,则IP会将它们抛弃.
read()调用之前/之后是无关紧要的.
数据报通道是否将一个
send(buffer.. )视为一个数据报包?
是.
如果它是部分发送怎么办?
UDP中没有这样的东西.
可以
read(.. )读取多个数据包
UDP读取将准确返回,只返回一个数据报或失败.
如果作为命令参数给出的缓冲区仅用于处理一个数据包,导致数据被丢弃?
不可能发生.
在下面重新评论,这是一个完全不同的问题,检测截断的常用技术是使用大于最大预期数据报的缓冲区.然后,如果你得到一个大小的数据报,(i)它是一个应用程序协议错误,(ii)它也可能被截断了.