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.客户端先 ...
随机推荐
- 5-让出CPU执行权的yield方法
让出CPU执行权的yield方法 Thread类有一个静态的yield方法,当一个线程在调用yield方法时,实际上就是暗示线程调度器请求让出自己的CPU使用,但是线程调度器可以无条件忽略这个暗示. ...
- 理解ASP.NET Core - 配置(Configuration)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 配置提供程序 在.NET中,配置是通过多种配置提供程序来提供的,包括以下几种: 文件配置提供程 ...
- 洛谷2151[SDOI2009]HH去散步(dp+矩阵乘法优化)
一道良好的矩阵乘法优化\(dp\)的题. 首先,一个比较\(naive\)的想法. 我们定义\(dp[i][j]\)表示已经走了\(i\)步,当前在点\(j\)的方案数. 由于题目中限制了不能立即走之 ...
- 1002 写出这个数 (20 分) java解题
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 10^100. 输出格式: 在一行内输 ...
- 好奇!仅 13kB 大小的游戏,源码长啥样?
这个马赛克风格的表情正好 13Kb,有人竟然能用一个表情大小的空间,制作个游戏出来.我就不信这么点的地儿,能写出个花来?游戏能好玩吗?因为这些游戏点开就能玩,我抱着试一试的心态把玩了一会. 事实证明是 ...
- Web前端安全之安全编码原则
随着Web和移动应用等的快速发展,越来越多的Web安全问题逐渐显示出来.一个网站或一个移动应用,如果没有做好相关的安全防范工作,不仅会造成用户信息.服务器或数据库信息的泄露,更可能会造成用户财产的损失 ...
- Convolutional Neural Network-week1编程题(TensorFlow实现手势数字识别)
1. TensorFlow model import math import numpy as np import h5py import matplotlib.pyplot as plt impor ...
- 【好好编程-技术博客】微信小程序开发中前后端的交互
微信小程序开发中前后端的交互 微信小程序的开发有点类似与普通网页的开发,但是也不尽然相同.小程序的主要开发语言是JavaScript,开发同普通的网页开发有很大的相似性,对于前端开发者而言,从网页开发 ...
- redis中lua脚本的简单使用
一.背景 在使用redis的过程中,发现有些时候需要原子性去操作redis命令,而redis的lua脚本正好可以实现这一功能.比如: 扣减库存操作.限流操作等等. redis的pipelining虽然 ...
- 进阶区forgotg攻防世界
攻防世界进阶区--forgot 前言,这题中看不中用啊宝友!!! 1.查看保护 第一反应就是蛮简单的,32位. 2.获取信息(先运行程序看看) 装的可以,蛮多的东西. 但是就是中看不中用 3.ida ...