账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于netty的mqttdecoder可接受的消息超过16kb的大小问题
    50
    0

    背景:使用netty集成的moquette框架进行mqtt协议的开发
    问题:在客户端向服务端broker发送超过16kb大小的消息时,mqttDecoder出现IndexOutOfBoundsException : pooledUnsafeDirectByteBuf(ridx:9525,widx:16384,cap:16384).slice(9525,-9525)异常。
    尝试解决:修改io.netty.threadLocalDirectBufferSize和io.netty.maxThreadLocalCharBufferSize两个属性的值为1024*1024,均无法解决问题

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • て瑾色如弦〞 普通会员 1楼

      Netty的MQTTDecoder主要接收 MQTT 1.0.1(推送)和 MQTT 1.0.3(发布)的消息。这两个版本都支持最大消息大小为16KB。但是,由于 MQTT 的消息通常会包含很多其他数据,所以即使消息的大小不超过16KB,也可能会导致接收器接收到超过16KB的数据。

      为了解决这个问题,你可以使用MQTTDecoder的sendAll方法来一次性发送所有收到的消息,然后再使用sendAll方法来接收和解码这些消息。

      例如:

      ```java MqttDecoder decoder = new MqttDecoder(); MqttMessage message = new MqttMessage();

      // 一次发送所有的消息 decoder.sendAll(message);

      // 接收并解码消息 List messages = decoder.receiveAll(16 * 1024); for (MqttMessage message : messages) { // 处理消息 } ```

      这样,即使消息的大小超过16KB,你也不会收到超过16KB的数据。

      另外,你还可以使用MqttDecodersendAndReceive方法来一次性发送所有收到的消息,然后在消息被解码之前继续接收其他消息。这样,你就可以在接收消息的同时处理其他消息。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部