一、问题由来

现在开发的一个项目中使用webSocket这个技术和Unity客户端程序进行联动操作,因为socket连接相对来说比http请求连接更加的快速,而且是

一个长链接,方便于这个项目进行其他的业务操作,最终将这个技术应用在了项目中。在使用过程中出现一个问题,就是客户端在断开之后,再次

连接时出现问题,错误信息如下

大致意思就是创建的那个WebSocketServer对象为null,然后就一直报错。由于这个项目的特殊性,客户端只有一个,因此服务端的

WebSocketServer对象也只有一个,创建连接时会创建一个WebSocketServer对象,并且将它存储在ConcurrentHashMap集合中,为

了出现线程安全的问题,因此选择这个集合。连接断开的时候,清除这个集合中的元素。
二、问题分析

对于出现的这个问题,我就很纳闷了,怎么一般情况下使用的时候都好好的,可一段断开之后再次连接时就出现问题呢?这到底是什么原因呢?

自己做过一种假设,服务端的WebSocketServer对象只有一个,如果不清除这个对象行不行呢?带着这样的疑问,我开始各种尝试。

private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();

三、解决方案

尝试解决办法一:服务端连接断开的时候,不清除ConcurrentHashMap集合中保存的WebSocketServer元素,重新打包发布,测试,结果不行。

继续进行分析:服务端的WebSocketServer只有一个,可是连接确有多个,会不会是连接session没有正确清除或者关闭导致的问题呢?

private static ConcurrentHashMap<String, Session> sessionMap = new ConcurrentHashMap<>();

尝试解决办法二:将创建的这集合在服务连接时,加入到这个集合中,在连接关闭时,从集合中进行清除。继续打包,发布、测试,结果不行。

可是这时报了一个新的错误,不在是webSocketServer为null了,而是

The WebSocket session [0] has been closed and no method (apart from close()) may be called on a closed session 这个错误信息。最起码错误

信息已经不一样了。大致意思就是 WebSocket会话已关闭,不能对已关闭的会话调用任何方法(close()除外),新的错误信息让我很是高兴,

感觉总算是有点起色了。自己带着这个问题去必应里面进行搜索,找到了问题的原因。

导致这个问题的原因是: 使用ConcurrentHashMap这个集合的时候,自己认为它解决了线程安全的问题,可是出现一个新的问题,就是清除这个集合

的时候,连接信息session没有被清除,因此导致出现这个奇怪的问题。文中也提供了解决方案,

尝试解决办法三:解决办法为使用CopyOnWriteArraySet这个集合来存储每一次有连接加入时创建的新的WebSocketServer对象,连接断开时,在

清除这个对象即可。自己立马进行尝试,修改代码,打包,发布,测试,问题解决。

参考博文 https://blog.csdn.net/canot/article/details/52495333

最后说明一点: CopyOnWriteArrayList是线程安全的。介绍可以参考文章

https://www.cnblogs.com/xiaolovewei/p/9142046.html

The WebSocket session [0] has been closed and no method (apart from close()) may be called on a closed session-ConcurrentHashMap使用在webSocket中采的坑的更多相关文章

  1. 解决WebSocket后台报错:The WebSocket session [0] has been closed and no method (apart from close()) may be called on a closed session

    场景1: 在后台数据对前台页面进行数据实时推送下,后台采取定时查询数据后,推送给前台页面.在这个过程中,前台页面不停的刷新页面,session在不停的关闭和开启,推送数据时,会出现session连接已 ...

  2. 使用PsExec tool在Session 0下运行程序

    在Service程序中使用OutputDebugString输出log信息, 在当前用户直接运行DbgView.exe, log信息是不会输出到DbgView窗口的.原因是Server程序运行在Ses ...

  3. 解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离

        在某国外大型汽车公司BI项目中,有一个子项目,需要通过大屏幕展示销售报表,程序需要自动启动和关闭.开发人员在开发过程中,发现在Win7的service中不能直接操作UI进程,调查过程中,发现如 ...

  4. [转]解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离

    服务(Service)对于大家来说一定不会陌生,它是Windows 操作系统重要的组成部分.我们可以把服务想像成一种特殊的应用程序,它随系统的“开启-关闭”而“开始-停止”其工作内容,在这期间无需任何 ...

  5. 穿透Session 0 隔离(一)

    服务(Service)对于大家来说一定不会陌生,它是Windows 操作系统重要的组成部分.我们可以把服务想像成一种特殊的应用程序,它随系统的“开启-关闭”而“开始-停止”其工作内容,在这期间无需任何 ...

  6. 穿透Session 0 隔离(二)

    上一篇我们已经对Session 0 隔离有了进一步认识,如果在开发过程中确实需要服务与桌面用户进行交互,可以通过远程桌面服务的API 绕过Session 0 的隔离完成交互操作. 对于简单的交互,服务 ...

  7. 面试问题:Vista与XP的Session 0与Session X的区别

    面试问题:Vista与XP的Session 0与Session X的区别 在XXXXX的一次面试中,笔试问题的题目曾提到Session 0.Session 1在Vista和Xp中的区别?现在把答案发上 ...

  8. 远程线程注入dll,突破session 0

    前言 之前已经提到过,远线程注入和内存写入隐藏模块,今天介绍突破session 0的dll注入 其实今天写这个的主要原因就是看到倾旋大佬有篇文章提到:有些反病毒引擎限制从lsass中dump出缓存,可 ...

  9. 远程线程注入DLL突破session 0 隔离

    远程线程注入DLL突破session 0 隔离 0x00 前言 补充上篇的远程线程注入,突破系统SESSION 0 隔离,向系统服务进程中注入DLL. 0x01 介绍 通过CreateRemoteTh ...

随机推荐

  1. [CVE-2020-1956] Apache Kylin远程命令执行漏洞复现

    Apache Kylin是一个开源的.分布式的分析型数据仓库,提供Hadoop/Spark之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由 eBay 开发并贡献至开源社区. ...

  2. httpd通过ajp协议反向代理tomcat

    外网服务器上启动tomcat. [root@VM_0_12_centos bin]# ./startup.sh Using CATALINA_BASE: /root/tomcat/apache-tom ...

  3. MSSQL2008 无法分配空间,因为PRIMARY文件组已满

    1.收缩数据库日志 https://jingyan.baidu.com/article/1709ad808a279f4635c4f060.html 完整代码: --查看数据库的存放位置-- selec ...

  4. C# 中 AppDomain 的一些理解

    C# 中 AppDomain 的一些理解 前言 一直想写一个这样的程序:与其它的程序完全解耦,但可以动态的加载其它程序,并执行其中的特定方法,执行完后可以卸载,完全不影响该程序本身.最近无意间发现了 ...

  5. 离散化模板题 II ——重复元素离散化后的数字不相同

    离散化模板题 II --重复元素离散化后的数字不相同 题目描述 现有数列A1, A2, ⋯, An,数列中可能有重复元素. 现在要求输出该数列的离散化数列,重复元素离散化后的数字不相同. 输入 第一行 ...

  6. Android仿QQ空间发表动态

    效果展示图: 功能描述:用户点击+会进入发表动态的界面,发表成功后跳转到个人首页. 后续完善:增加个人头像的上传,对界面进行优化,增加点赞和评论的功能. 主要采用listview对内容进行展示,对sq ...

  7. CDI 组件拦截器的使用和学习

    拦截器的作用原理: 声明拦截器,加@Interceptor注解 方法有二: 1)为拦截器添加Qualifier: 2)不添加Qualifier.为拦截器添加具体的拦截方法,该方法加@AroundInv ...

  8. PHP的DBA扩展学习

    今天我们讲的 DBA 并不是传统的数据库管理员那个 DBA ,而是一个 PHP 中的巴克利风格数据库的扩展.巴克利风格数据库其实就是我们常说的键值对形式的 K/V 数据库.就像我们平常用得非常多的 m ...

  9. Zookeeper分布式安装部署

    1. 解压安装 1.1 解压Zookeeper安装包到/opt/module/目录下 tar -zxvf /opt/software/apache-zookeeper-3.6.2-bin.tar.gz ...

  10. Jmeter系列(34)- Jmeter优化常识

    Jmeter UI页面是调试脚本的,运行脚本使用命令行运行:Windows使用batch,Linux使用shell Jmeter减少使用各类监听控件,吃内存.CPU:用后置处理去拿log文件,生成图表 ...