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

Java 如何使用Netty在单个端口上编写多协议处理程序?,java,tcp,binary,ascii,netty,Java,Tcp,Binary,Ascii,Netty,我是Netty的新手,我想知道当TCP客户端有时发送可变长度的二进制记录(十六进制),有时发送可变长度的ASCII记录时,如何读取/处理传入的TCP数据,这些记录都不由回车符或换行符分隔 TCP客户端正在发送字节流,如下所示: 一种二进制字节流,以“$”开头,但字节数不同,且不以任何字符结尾,以及 一种ASCII字节流,以“(”开头,以“')”结尾,但字节数不同,且不以任何字符结尾 两组记录到达同一端口 我需要如何编写基于Netty的TCP服务器来处理/读取这两者 提前谢谢 库纳尔检查。它完全符

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

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

  • 一种二进制字节流,以“$”开头,但字节数不同,且不以任何字符结尾,以及

  • 一种ASCII字节流,以“(”开头,以“')”结尾,但字节数不同,且不以任何字符结尾

  • 两组记录到达同一端口

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

    提前谢谢


    库纳尔

    检查。它完全符合您的要求。

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

    这取决于您的流的长度

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

    • 类型为一个字节(字节或字符串)
    • 帧长度(数据字节数)为2字节(例如使用无符号Int16)
    然后,您可以使用帧解码器接收和解码整个帧

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

    • 将流拆分为帧(由于每个帧的标题,因此会有一点开销)
    • 使用Channel.close()事件通知EndOfStream(如果需要创建新连接并反复进行握手,这会更容易,但可能会导致一些延迟问题
    在任何情况下,Netty都会为流式字符串生成一些StringEncoderStringDecoder。还有一些FrameDecoderFrameEncoder,具有各种有用的头