是否有必要在java UDP服务器实现中存储传入的消息?

时间:2013-03-15 04:03:30

标签: java nio

大家好日子!

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

1 个答案:

答案 0 :(得分:1)

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

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

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

但是,如果您有多个UDP数据报发送的消息,则需要一个缓冲区才能重建原始消息。您还需要注意消息顺序(因为UDP数据报可能由网络重新排序)和丢失的数据报(因为UDP是not reliable