如何使用Netty在单个端口上编写多协议处理程序?

时间:2012-04-17 08:07:27

标签: java tcp binary ascii netty

我是Netty的新手,我想知道当TCP客户端有时发送可变长度的二进制记录(十六进制)时,如何读取/处理传入的TCP数据,有时会发送可变长度的ASCII记录,其中没有一个是分隔的通过回车或换行。

TCP客户端正在发送字节流,如下所示:

  1. 以'$'开头但具有不同字节数且不以任何字符终止的二进制字节流,

  2. ASCII字节流,以'('和''结尾'开头但具有不同的字节数,不会被任何字符终止

  3. 两组记录都到达同一个端口。

    我如何编写基于Netty的TCP服务器来处理/读取两者?

    提前致谢。

    注:Kunal

2 个答案:

答案 0 :(得分:5)

结帐port unification example。它完全符合您的要求。

答案 1 :(得分:0)

首先,不要将所有内容混合在一起'$'是一个Char,它可以在大多数编码中用一个字节表示,但对于一个普通的char来说情况就不是这样了(在UTF-8中,char是一个可变长度编码的并且可以使用1,2或3个字节。

这取决于您的信息流的长度。

1)最简单的解决方案是,使用带有两个字段标题的框架 适合您的内存

  • 类型的一个字节(字节或字符串)
  • 2个字节(例如,使用无符号的Int16)表示帧的长度(数据的字节数)。

然而,您可以使用FrameDecoder接收和解码整个帧。

2)如果您的信息流非常庞大并且无法容纳在内存中,那么您有两种解决方案:

  • 将您的信息流划分为帧(由于每个帧的标题而略有开销)
  • 使用 Channel.close()事件通知 EndOfStream (这更容易,但如果您需要创建新连接并执行某些操作,可能会导致一些延迟问题一次又一次地握手......

在每种情况下,Netty都会为流式字符串生成一些 StringEncoder StringDecoder 。还有一些 FrameDecoder FrameEncoder ,带有各种有用的标题。