2013-03-15 38 views
1

大家好日子!是否需要在java UDP服务器实现中存储传入消息?

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

回答

1

您引用的问题是关于TCP通道,它与您正在使用的UDP通道不同。 (即,TCP层中没有“消息”; TCP是单个字节流,并且在“消息”中拆分流是该应用的关注)。应用程序必须处理字节流并提取消息。主机可以写入一些字节到TCP通道,然后写入更多的字节;另一个主机不能确定它们是以两种(或多种)不同的操作写入,还是只写入一种。另一台主机只按照它们发送的顺序读取字节。

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

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

+0

你能准确地发送一些短消息就等于发送1数据报吗?即使这条消息很短,客户端计算机是否可以将我的消息分成几个数据报? – Baurzhan 2013-03-15 04:52:51

+0

对'DatagramChannel.send'的调用只发送**一个数据报**,并且不会被客户机分割。 – Javier 2013-03-15 04:55:49

+0

实际上,我并没有在客户端使用DatagramChannel.send - 它是一些配置为通过UDP协议将消息发送到某个IP地址的设备。我不知道它是如何在内部向我发送消息的。它似乎是测试它的唯一方法是分析来自此设备的日志) – Baurzhan 2013-03-15 04:58:54

相关问题