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)

大家都在看

  • MySQL触发器

    触发器 先来个实际的案例 触发器概述 和存储过程一样,都是嵌入在MySQL服务器中的一段程序 触发器由 事件触发,比如INSERT ,UPDATE 等用户的动作或触发某项行为,自动…

    数据库 2023年5月24日
    091
  • Java学习-第一部分-第二阶段-第四节:常用类

    常用类 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 包装类 包装类的分类 针对八种基本数据类型相应的引用类型…

    数据库 2023年6月11日
    093
  • SQL Server如何修改登录密码

    SQL Server如何修改登录密码 我们在打开SQLserver的时候一般选择的是”Windows身份认证”进行登录,如果选择混合模式该怎么登录呢?或者忘…

    数据库 2023年6月9日
    081
  • Harsh =哈希 =散列

    key-hash-%-index Harsh =哈希 =散列 HarshCode=哈希码=哈希代码=散列码=散列值 哈希函数=散列函数=哈希算法=Harsh Algorithm 散…

    数据库 2023年6月14日
    068
  • Redis学习(1)—Redis概述

    什么是NoSQL NoSQL:Not Only SQL,意思不仅仅是SQL,它是属于 非关系型数据库。那什么是关系型数据库?数据结构是一种有行有列的数据库。 NoSQL数据库是为了…

    数据库 2023年6月14日
    071
  • InnoDB 中不同SQL语句设置的锁

    锁定读、UPDATE 或 DELETE 通常会给在SQL语句处理过程扫描到的每个索引记录上设置记录锁。语句中是否存在排除该行的WHERE条件并不重要。InnoDB不记得确切的WHE…

    数据库 2023年5月24日
    067
  • 我应该是最后一个知道 WSL 的吧!

    前言 前段时间,我买了块固态硬盘给我的笔记本电脑装上(因为它太慢了,影响我游戏学习)。同时也重装了系统,以前一直在用 Win8.1,在上面构建了我的开发环境:在 Win8.1 上安…

    数据库 2023年6月6日
    089
  • Mybatis-Plus使用 ORDER BY FIELD

    一、Mybatis-Plus使用 ORDER BY FIELD 如图所示 两张仅有一个字段关联的表,商品表想用活动商品表查出来的顺序去查商品可以使用以下方法(不想去XML写Sql的…

    数据库 2023年6月6日
    073
  • 🚴‍♂️全套MySQL数据库教程_Mysql基础入门教程,零基础小白自学MySQL数据库必备教程☔ #002 # 第二单元 MySQL数据类型、操作表#

    二、本单元知识点概述 (Ⅰ)知识点概述 二 、本单元目标 (Ⅰ)重点知识目标 1.Mysql的数据类型2.如何选择数据类型3.创建表4.修改表5.删除表 (Ⅱ)能力目标 1.熟练创…

    数据库 2023年5月24日
    076
  • 十一章 配置文件参数化

    把Spring配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中 1. 小配置文件(.properties) 2. 好处 : 利于维护 1.配置文件参数化开发步骤 已数…

    数据库 2023年6月14日
    069
  • mysql视图,索引

    一、视图 View 视图是一个 虚拟表,是sql语句的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图的数据变化会影响到基…

    数据库 2023年6月9日
    056
  • MySQL8自增主键变化

    MySQL8自增主键变化 醉后不知天在水,满船清梦压星河。 一、简述 MySQL版本从5直接大跃进到8,相信MySQL8一定会有很多令人意想不到的改进,如果不想只会CRUD可以看看…

    数据库 2023年6月14日
    070
  • Shell第四章《正则表达式》

    1.1、名词解释 正则表达式(regular expression, RE)是一种字符模式,用于在查找过程中匹配指定的字符。在大多数程序里,正则表达式都被置于两个正斜杠之间;例如/…

    数据库 2023年6月14日
    080
  • StoneDB 为何敢称业界唯一开源的 MySQL 原生 HTAP 数据库

    时代在召唤: HTAP Is On The Way 近些年,HTAP 正在受到人们越来越多的关注,Gartner 在 2014 年提出了 HTAP 这个术语和它的定义: Hybri…

    数据库 2023年5月24日
    079
  • 数据专家最常使用的 10 大类 Pandas 函数 ⛵

    💡 作者:韩信子@ShowMeAI📘 数据分析实战系列:http://www.showmeai.tech/tutorials/40📘 本文地址:http://www.showmea…

    数据库 2023年6月14日
    076
  • podman基础用法

    podman的基础设置和使用 运行示例容器 列出正在运行的容器 检查正在运行的容器 测试httpd服务器 查看容器的日志 查看容器进程pid 对容器执行检查操作 还原容器 迁移容器…

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