当我从服务器向客户端或vise-verse发送数据包时,我需要确保数据包是合法的,我检查收到的数据包的大小,如果收到的数据包的大小与它的大小相同,则匹配它应该是。
每个数据包都是opcode
,操作码用于了解数据包的类型,例如操作码2是登录数据包。
因此登录数据包有一个操作码和两个字符串。 用户名最大长度为18,密码最大长度为12,因此登录数据包的大小必须为31。
但是当用户名小于18时会发生什么?如果我的密码是10,用户名是4,我的数据包大小将是15,根据系统检查,这将是非法的。
当我将bytebuf大小分配为31时,它将以31的容量发送,但是当它被接收时容量变为1024,不知道为什么。
这是做什么的,应该怎么做?
答案 0 :(得分:1)
TCP是基于流的协议。这意味着传入的bytebuf的长度与写入端的数据包长度无关。有不同的方法可以解决这个问题,最简单的方法是为数据包附加一个长度。您可以使用自己的自定义处理程序执行此操作,也可以使用已构建到Netty中的处理程序。以下示例显示了此配置的管道:
channelPipeline.addLast("framer", new LengthFieldBasedFrameDecoder(Short.MAX_VALUE,0,2,0,2));
channelPipeline.addLast("framer-prepender", new LengthFieldPrepender(2, false));
LengthFieldBasedFrameDecoder
的论据是:
LengthFieldPrepender
的论据是:
将上述类添加到管道时,可以使用buf. readableBytes()
来获取每个数据包包含的字节数。