3

我是 Netty 的新手,我想知道当 TCP 客户端有时发送可变长度的二进制记录(十六进制)并且有时发送可变长度的 ASCII 记录时如何读取/处理传入的 TCP 数据,这些记录都不是由回车分隔的或换行。

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

  1. 以“$”开头但字节数不定且不以任何字符结尾的二进制字节流,以及

  2. 以 '(' 开头并以 ')' 结尾的 ASCII 字节流,但字节数不同且不以任何字符结尾

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

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

提前致谢。

库纳尔

4

2 回答 2

5

查看端口统一示例。它完全符合您的要求。

于 2012-04-17T08:25:40.827 回答
0

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

这取决于您的流的长度。

1)最简单的解决方案,如果它可以放入发送者的内存中,是使用具有两个字段标题的帧

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

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

2)如果您的流很大并且无法放入内存中,您有两种解决方案:

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

在每种情况下,Netty 都为流式传输字符串提供了一些StringEncoderStringDecoder。还有一些带有各种有用标头的FrameDecoderFrameEncoder 。

于 2012-04-17T09:03:25.903 回答