Unable to unwrap data, invalid status [CLOSED]-服务端webSocket报错
一、问题由来
现在的项目中在使用webSocket这门技术,主要用来在服务端和客户端进行实时的数据传输,因为需要及时的进行响应,所以才没有使用http请求的方式,
而是使用socket的方式,这样可以快速建立起连接,并且能够将小程序端的操作实时的在客户端unity程序中进行响应。最开始做这个项目的时候,自己对
于技术选型这一块,就考虑使用webSocket,经常会在各种博客、论坛中看到关于它的介绍和使用。而且给人的感觉不是太难,因此就打算使用它。客户端
程序主要是unity程序来进行处理,会和java写的服务端进行实时通信传输很多数据,在刚开始测试的阶段我们都不知道这种方案能不能行得通,在经过多次
反复地测试之后,发现这种方式可行,最终采用这门技术应用于现在的系统当中。可是后来在使用的过程中出现一个问题,就是当webSocket运行出现异常,
比如客户端和服务端的连接由于网络不好断开之后,当网络恢复正常再次进行连接时就会频繁报错,

报错信息是客户端发送的心跳包数据,由于客户端不知道服务端已经出现问题,因此频繁的发送心跳包就一直报错。
二、问题分析
自己在写服务端时,当运行onError方法时,会清除一个唯一的webSocket连接,由于这个项目的特殊性,只需要始终让服务端和客户端保持有一个有效的连接
即可。自己的想法是,明明已经清楚了服务端唯一的连接,为什么还会出现这种问题呢?

这个问题隔三差五的就会出现,必须要解决,如果不解决的话肯定会影响项目的正常运行。
三、解决方案
进过对问题的仔细分析后,自己尝试着去解决这个问题,一个一个地进行尝试。
方案一:在运行出错的时候,主动调用webSocket中提供的关闭连接的方法,使用this来进行调用。

测试结果,没有解决。
方案二:在运行出错的时候,主动获取集合里面的那个唯一的webSockerServer对象,然后使用这个对象来调用onClose方法,并且关闭当前的连接
会话session。

代码修改好之后,和客户端进行反复的联调测试,发现问题解决。解决这个问题的思路就是,如果服务端运行出现异常,就在服务端主动
关闭这个连接;当这个连接关闭之后,当客户端和服务端想再次进行通信时,就会重新创建一个新的连接,保重系统的正常运行。
至此问题解决,可能也是这个项目的特殊性才导致这个项目只需要有一个唯一的连接就可以,遇到的问题也比较好解决。总结一下就是如果
服务端想关闭掉某个连接,则最好是先找到这个webSocket这个连接,然后关闭即可,还有关闭当前的会话信息,不能使用集合直接清除,
直接清除结合的话,webSocketServer是清除了,可是连接会话信息却还在,因此导致我出现那个问题。
Unable to unwrap data, invalid status [CLOSED]-服务端webSocket报错的更多相关文章
- 【使用WCF,发布服务端浏览报错】未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089” 中加载类型 “System.ServiceModel.Activation.HttpModule”。
问题: 在WIN7中的IIS服务器中部署WCF服务程序时,通过浏览器访问报出如下错误: 未能从程序集"System.ServiceModel, Version=3.0.0.0, Cultur ...
- SpringBoot注册Windows服务和启动报错的原因
SpringBoot注册Windows服务和启动报错的原因 Windows系统启动Java程序会弹出黑窗口.黑窗口有几点不好.首先它不美观:其次容易误点导致程序关闭:但最让我匪夷所思的是:将鼠标光标选 ...
- 【spring boot】spring cloud下spring boot微服务启动没有报错,但是访问访问不到
spring cloud下spring boot微服务启动没有报错,但是访问访问不到 解决方法: 可能是端口被占用了,但是依旧启用成功了. 更改一下项目启用的端口号,再重新启动查看是否可以正常访问.
- 阿里云服务执行mysql_install_db报错
问题描述:阿里云服务执行mysql_install_db报错解决方案:安装autoconf库(yum -y install autoconf)然后在执行:mysql_install_db就会出现这样, ...
- Eureka 客户端连接Eureka服务端时 报Cannot execute request on any known server 解决办法
报Cannot execute request on any known server 这个错,总的来说就是连接Eureka服务端地址不对. 因为配置eureka.client.serviceUrl. ...
- systemctl status ssh.service 服务重启出现报错
Case: ubuntu在从Ubuntu 16.04 LTS 升级到18.04 的时候,执行 do-release-upgrade -d 后,发现ssh无法登陆服务器, Solution: 1.通过s ...
- 【Solr】新建core后,启动服务访问web报错 HTTP Status 503
新建core collection2后,启动solr服务,访问solr web界面报错. HTTP Status 503 - Server is shutting down or failed to ...
- c#实现服务端webSocket
现阶段socket通信使用TCP.UDP协议,其中TCP协议相对来说比较安全稳定!本文也是来讲解TCP为主(恕在下学艺不精). 下面是个人理解的tcp/ip进行通讯之间的三次握手! 1.客户端先发送报 ...
- 【WebSocket No.1】实现服务端webSocket连接通讯
前言 现阶段socket通信使用TCP.UDP协议,其中TCP协议相对来说比较安全稳定!本文也是来讲解TCP为主(恕在下学艺不精). 下面是个人理解的tcp/ip进行通讯之间的三次握手! 1.客户端先 ...
随机推荐
- PyTorch中的Batch Normalization
Pytorch中的BatchNorm的API主要有: 1 torch.nn.BatchNorm1d(num_features, 2 3 eps=1e-05, 4 5 momentum=0.1, 6 7 ...
- HCNP Routing&Switching之BGP基础
前文我们了解了路由注入带来的问题以及解决方案相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15362604.html:今天我们来学习下新的路由协议BG ...
- IO之字符流
什么是字符流 对于文本文件(.txt .java .c .cpp) 使用字符流处理 注意点 读入的文件一定要存在 否则就会报FileNotFoundException 异常的处理 为了保证流资源 一定 ...
- BurpSuite 功能概览
简介 写作思想:相比较具体介绍某个功能的用法.会更加侧重于介绍 Burp 提供哪些功能.这样好处是在比较复杂的测试场景,如果Burp 刚好提供对应的功能,就不用花费精力造轮子了. 而需要掌握具体操作方 ...
- t-SNE算法
t-SNE 算法 前言 t-SNE(t-distributed stochastic neighbor embedding) 是用于降维的一种机器学习算法,由 Laurens van der Maat ...
- 2020.5.16-ICPC Central Europe Regional Contest 2019
A. ABB #include <bits/stdc++.h> using namespace std; #define PB push_back #define ZERO (1e-10) ...
- javascript-jquery介绍
jquery优势 1.轻量级 2.强大的选择器 3.出色的DOM封装 4.可靠的事件处理机制 5.完善的Ajax 6.不污染顶级变量 7.出色的浏览器兼容 8.链式操作方式 9.隐式迭代 10.行为层 ...
- SharkCTF2021 fastcalc题记
web --> python脚本编写练习. 直接访问发现全是乱码: 看包发现Content-Type里面没有charset=utf-8. 于是用python访问一下,用.encoding='ut ...
- poi实现生成下拉选联动
在我们实际的程序开发中,经常需要用到从excel导入数据中系统中,而为了防止用户在excel中乱输入文字,有些需要用到下拉选的地方,就需要从程序中动态生成模板.本例子简单的讲解一下,如何生成级联下拉选 ...
- LVDS DP等显示器接口简介
LVDS 产品传输速率从几百Mbps到2Gbps.它是电流驱动的,他通过在接收端放置一个负载而得到的电压,当电流正向流动,接收端输出为1,反之为0,它的摆幅250mV-450mV. lvds 即低压差 ...