一、问题由来

现在开发的一个项目中使用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

最新文章

  1. cache-coherent nonuniform memory access
  2. awk 学习笔记
  3. Android 手机卫士16--手机杀毒
  4. MDK中 use microlib
  5. JavaScript的事件对象_鼠标事件
  6. 黄聪:wordpress前台自定义用户,调用wp_editor上传附件提示【抱歉,出于安全的考虑,不支持此文件类型】错误。
  7. python 基础——实现一个带缓存功能的函数
  8. Java IO (5) - 总结
  9. Hive over HBase和Hive over HDFS性能比较分析
  10. ServerRelativeUrl与Url
  11. Map的遍历方式
  12. 用户输出表单处理php
  13. VIM快捷键(转)
  14. poj1511/zoj2008 Invitation Cards(最短路模板题)
  15. 使用 IDEA 创建 Maven Web 项目 (四)- 让 WEB 应用跑起来
  16. 内存映射mmap的几个api及其使用
  17. javascript的基础(2)--数据类型介绍
  18. 【一天一道LeetCode】索引目录 ---C++实现
  19. Java 图片爬虫,java打包jar文件
  20. Django使用Channels实现WebSocket--下篇

热门文章

  1. Python - 面向对象编程 - 小实战(2)
  2. java版gRPC实战之一:用proto生成代码
  3. Linux常用命令 - head命令详解
  4. Linux没有/var/log/messages日志文件
  5. 在PHP中检测一个类是否可以被foreach遍历
  6. Java基础系列(10)- 类型转换
  7. 使用Postman做接口测试(学生信息的6个接口)
  8. 2021“MINIEYE杯”中国大学生算法设计超级联赛(8)(1002,1004,1006,1009)
  9. Decorator装饰器模式个人理解
  10. 数据库建表权限 CREATE command denied to user for table