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.客户端先 ...
随机推荐
- 对于caffe程序中出现的Unknown database backend问题的报错怎么办?
在预处理器中添加USE_LMDB,因为caffe需要一种数据输入格式 这样,在db.cpp中#ifdef USE_LMDB就会变亮,显示使用的数据格式为LMDB
- Java初步学习——2021.10.05每日总结,第五周周二
(1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学习了二维数组,包括二维数组的声明,和二维数组的创建.以及获取二维数组的长度,其中要注意的是二维数组是每个元素都是一维数 ...
- appium操作安卓应用所需要的数据准备
操作系统.系统版本如下所示: desired_caps={} desired_caps["platformName"]="Android" desired_ca ...
- 2020.5.17--牛客小白月赛25 F.疯狂的自我检索者
F.疯狂的自我检索者 链接:https://ac.nowcoder.com/acm/contest/5600/F来源:牛客网 牛妹作为偶像乐队的主唱,对自己的知名度很关心.她平时最爱做的事就是去搜索引 ...
- 【Python】 第三周:基本数据类型
整数 python整数无限制 二进制:以0b或者0B开头,例如: 0b010,-0B101 八进制:以0o或者0O开头,例如:0o123,-0O456 浮点数 浮点数间运算存在不确定尾数,不是bug ...
- gin 源码阅读(5) - 灵活的返回值处理
gin 源码阅读系列文章列表: gin 源码阅读(1) - gin 与 net/http 的关系 gin 源码阅读(2) - http请求是如何流入gin的? gin 源码阅读(3) - gin 路由 ...
- 在hive中使用COALESCE进行空值处理
COALESCE (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值.如果所有的表达式都是空值,最终将返 ...
- javascript高级程序设计第三版书摘
在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...
- Map中getOrDefault()与数值进行比较
一般用哈希表计数时,value类型通常为Integer.如果想比较某个key出现的次数,使用get(key)与某个数值进行比较是有问题的.当哈希表中并不包含该key时,因为此时get方法返回值是nul ...
- relativeLayout相对布局的嵌套在py中的引用
from kivy.app import App from kivy.uix.button import Button from kivy.uix.relativelayout import Rela ...