gpt4 book ai didi

java - 带字符串验证的 ByteBuf 数据包大小?

转载 作者:行者123 更新时间:2023-11-30 07:32:05 26 4
gpt4 key购买 nike

当我从服务器向客户端或反之发送数据包时,我需要确保该数据包是合法的,我检查接收到的数据包的大小,如果接收到的数据包的大小与它的大小相同,则进行匹配应该是。

每个数据包都是一个操作码,操作码用于知道它是什么类型的数据包,例如操作码2是登录数据包。

所以登录数据包有一个操作码和两个字符串。例如,用户名最大长度为18,密码最大长度为12,因此登录数据包的大小必须为31。

但是当用户名小于 18 时会发生什么?如果我的密码是10,用户名是4,那么我的数据包大小将为15,根据系统检查,我的数据包大小将是非法的。

当我将 bytebuf 大小分配为 31 时,它将以 31 的容量发送,但当接收到时,容量变成 1024,不知道为什么。

它在做什么以及应该如何完成?

最佳答案

TCP 是基于流的协议(protocol)。这意味着传入的 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。 ReadBytes() 获取每个数据包包含的字节数。

关于java - 带字符串验证的 ByteBuf 数据包大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35962466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com