1

大家好!

我正在开发基于 java NIO 的简单 java UDP 服务器。在这里,我读到我必须将所有传入消息存储在某个缓冲区中,并以某种方式识别换行符。但是,如果传入的消息大小总是 <= 缓冲区大小,我是否有必要存储以前的状态?我的意思是我的 ByteBuffer 足够大,可以存储任何传入的消息。在某些情况下,最好确保自己不处理诸如 monolit 之类的消息,而它们只是某些大消息的一部分?我只是不想做开销工作,想要精确分配足够大的缓冲区危险策略与否。

4

1 回答 1

1

您引用的问题是关于 TCP 通道的,它与您使用的 UDP 通道不同。

TCP 是面向字节的(也就是说,TCP 层中没有“消息”;TCP 是单个字节流,将流拆分为“消息”是应用程序的关注点)。应用程序必须处理字节流并提取消息。主机可能会将一些字节写入 TCP 通道,然后它会写入更多字节;另一台主机无法判断它们是用两个(或多个)不同的操作编写的,还是单个操作编写的。另一台主机只读取字节,其顺序与发送它们的顺序相同。

另一方面,UDP 是面向数据报的:您从一个主机发送一些字节(一个数据报),而另一台主机将接收该数据报。数据报既不合并也不拆分(但它们可能会丢失)。DatagramChannel.read将只返回一个数据报。如果每条消息都适合 UDP 数据报,那么您不需要保留缓冲区。

但是,如果您有在多个 UDP 数据报中发送的消息,您将需要一个缓冲区来重建原始消息。您还需要注意消息顺序(因为 UDP 数据报可能会被网络重新排序)和丢失数据报(因为 UDP不可靠

于 2013-03-15T04:31:05.597 回答