mqtt长连接报错32000

背景

项目需要使用mqtt协议建立长连接,我是客户端,需要连上服务端同学的提供的地址;客户端使用的是paho提供的客户端sdk,如下:


    org.eclipse.paho
    org.eclipse.paho.client.mqttv3
    1.2.5

建立连接代码也十分简单,和github上demo差不多:

public void createMqttConnection(){
        try {
            String ts = System.currentTimeMillis() + "";
            String password = "password";
            String clientId = "server_" + InetAddress.getLocalHost().getHostAddress() + "_" + ts;
            String broker = mqttConfig.getMqttHost();

            MemoryPersistence persistence = new MemoryPersistence();
            mqttClient = new MqttClient(broker, clientId, persistence);
            mqttClient.setCallback(new MqttCallback() {
                @Override
                public void connectionLost(Throwable cause) {
                    System.out.println("连接断开");
                    cause.printStackTrace();
                }

                @Override
                public void messageArrived(String topic, MqttMessage message) throws Exception {

                }

                @Override
                public void deliveryComplete(IMqttDeliveryToken token) {

                }
            });
            MqttConnectOptions connectOptions = new MqttConnectOptions();
            connectOptions.setUserName("server");
            connectOptions.setPassword(password.toCharArray());
            connectOptions.setAutomaticReconnect(true);
            connectOptions.setCleanSession(true);
            connectOptions.setKeepAliveInterval(20);

            log.info("Mqtt connection Initialization begin!");
            mqttClient.connect(connectOptions);
            log.info("Mqtt connection success!");
        } catch (Exception e) {
            log.error("Mqtt connection initialization error ", e);
        }
    }

问题

服务启动,并成功连接上过后,总是报错: 等待来自服务器的响应超时(32000),如下图

mqtt长连接报错32000

排查

打开wireshark抓包,结果如下,时间顺序是从下到上,发现,TCP三次握手建立连接后(362,363,364),并成功验证了username,password后(392,393,395,396),的确20s后( keepAliveInterval设置的20),客户端向服务器发送了心跳包(3456【PSH, ACK】),这个发送,是被【ACK】(3458)了,但是在接下来的20s内,服务器都没有返回心跳给客户端,在客户端看来,那么服务器就是挂了,所以断开连接,产生了接下来的【FIN ACK】(6136),四次挥手(6137,6138)断开了TCP连接(至于为什么四次挥手只抓到3个包,后文有补充);由于设置了 setAutomaticReconnect=true,又开始三次握手建立连接了。

mqtt长连接报错32000

结论

服务器没有返回心跳给客户端,客户端以为服务器挂了,就断开连接报错。需要让服务器端同学,修复一下心跳发送相关代码。

为什么四次挥手只有3个包
参考:Linux之TCP的实现,四次挥手
大概意思就是Linux中支持TCP的延迟ACK机制,发送ack的条件不能满足立即发送ack的条件,导致ack的发送被延时了,于是和下一个FIN合在一起发;包括本文中问题修复正常后,服务器端(Linux)返回的心跳也有这个ACK延迟

Original: https://www.cnblogs.com/rachel-aoao/p/16282083.html
Author: rachel_aoao
Title: mqtt长连接报错32000

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601335/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Mac IDEA 最常用快捷键(详解版)

    学习背景 公司同事让我提供一个简单的 rpc 接口,然后他坐在我旁边看着我写,写的过程中他不断打断我,比如我在代码换行时,如果光标不在下一行行首或者这行的行尾,我就会先移动光标到行…

    数据库 2023年6月6日
    089
  • git 开发规范

    开发总结最重要的是文档和开发流程 文档最重要:记录开发学习的内容,可以是一种总结,此为其一。留下文档可助后生快速入门,减少学习和指导成本,此为其二。来日需要对项目二次开发或者重构追…

    数据库 2023年6月9日
    0139
  • 【java框架】SpringBoot(11) — SpringBoot利用监听事件,实现异步操作

    请出主角:Spring当中的事件机制 没错,本节主要讲的是Spring中事件机制:ApplicationEventPublisher,实现监听ApplicationEvent,最后…

    数据库 2023年6月6日
    0138
  • django-Celery分布式队列简单使用

    介绍: Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。 它是一个专注于实时处理的任务队列,同时也支持任务调度。 worker…

    数据库 2023年6月6日
    0101
  • MySQL–数据过滤(AND、OR、IN、NOT操作符)

    MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用。 1、组合WHERE子句 此SQL语句检索由供应商1003制造且价格小于等于…

    数据库 2023年6月16日
    090
  • Docker简介

    1.什么是Docer 在计算机的世界中,容器拥有一段漫长且传奇的历史。容器与管理程序虚拟化 (hypervisor virtualization,HV)有所不同,管理程序虚拟化通过…

    数据库 2023年6月14日
    0100
  • MySQL完整版详解

    一、数据库的操作 1.创建数据库 若在可视化软件上创建数据库,参考如下图 如果要创建的数据库不存在,则创建成功 create database if not exists west…

    数据库 2023年6月16日
    068
  • python pywin32学习笔记

    参考博客链接 参考博客链接 pyhandle windows窗体句柄,int 类型  className 窗体类名  text 窗体标题 窗体置顶  窗体最大化 通过父pyhand…

    数据库 2023年6月11日
    091
  • IntelliJ IDEA community 安装教程

    jetbrains官网下载 IntelliJ IDEA安装包 此处选择社区版的zip文件 下载完成后解压安装包,此处解压目录为 E:\IntelliJ IDEA\ 开始安装首先添加…

    数据库 2023年6月11日
    0107
  • 索引的树结构

    二分查找 二叉树 二叉平衡树 B-TREE :二叉平衡树的基础上,使加载一次节点,可以加载更多路径数据,同时把查询范围缩减到更小 缺点:业务数据的大小可能远远超过了索引数据的大小,…

    数据库 2023年5月24日
    068
  • Windows 装机必备

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月6日
    077
  • 牛客SQL刷题第一趴——非技术入门基础篇

    id device_id gender age university province 1 2138 male 21 北京大学 Beijing 2 3214 male 复旦大学 S…

    数据库 2023年5月24日
    0110
  • 快速入门上手Markdown

    第一次接触 Markdown是写代码初期看很多大佬的 github,他们的项目一定会有一份文件叫 Readme.md的文件他们由一些简单美观的符号和汉字字母组成,编译之后成为一篇简…

    数据库 2023年6月11日
    092
  • typora最后的免费版本

    需要的阿里云盘自取 「typora最后的免费版本」https://www.aliyundrive.com/s/p3Ci2gbgwYh点击链接保存,或者复制本段内容,打开「阿里云盘」…

    数据库 2023年6月6日
    086
  • MySQL 索引排序

    表结构和数据 CREATE TABLE t1 ( id int(11) NOT NULL AUTO_INCREMENT, a int(11) DEFAULT NULL, b int…

    数据库 2023年5月24日
    083
  • English words 929 9:00

    本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://www.cnblogs.com/ukzq/p/16743070.html Or…

    数据库 2023年6月11日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球