热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Websocket相关问题总结(Session共享,用户多端登录等)

我们在使用websocket的时候其实主要面对的问题就是session共享的问题:不管是基于Spring实现的Websocket的WebsocketSession还是

我们在使用websocket的时候其实主要面对的问题就是session共享的问题:

不管是基于Spring实现的Websocket的WebsocketSession

还是基于JDK实现的Session

亦或者基于netty实现的ChannelHandlerContext

用图来描述下场景吧:

OK,大家看到这个图了,差不多应该明白了Session共享应该怎么处理了。其实原理很简单:

1、我们知道nginx有IP保持的功能,其实这个功能就能解决大部分场景的Session共享问题。 但是某些极限情况下还是会有问题,比如在浏览器没有关闭的情况下同一个用户更换了网络的情况导致IP变了,或者对于某些网络的IP是变动的情况下,就会出现Session找不到的情况。

2、基于上述nginx的原理我们可以进行优化,还是单例存储。那么要操作的时候,我告诉所有的服务端,你们去找这个用户的Session,并把消息带过去。那么相应的节点根据用户拿到Session了就可以进行处理了。

上面2点大概简单的描述了下Session共享的原理,那么有这么个场景,文字可能不太好表达,我们还是用图来说明:

一般出现多端情况也应该就上面2种情况,要么允许,要么不允许。我这里简单的说下不允许的处理流程。

建立连接的时候,先获取老的Session

Session oldSession = SOCK_MAP.get(baseStudentInfo.getId());

 存在,则推送关闭消息,不存在告知其他节点去清楚。当然本节点的的Server要排除在外,这里就通过IP判断即可。

if(oldSession!=null) {
oldSession.getBasicRemote().sendObject(close);
}else{
//关闭其他节点的的session
authService.pushCloseMessage(close);
}
//替换
SOCK_MAP.put(baseStudentInfo.getId(),session);

消息监听

String serverIp = IPUtils.getLocalhostIp();
logger.info("当前IP:"+serverIp);
logger.info("content的IP:"+wsMessage.getBody().getContent());
//IP不相等,说明不是当前连接的服务端,关闭其他端口
if(!serverIp.equals(wsMessage.getBody().getContent())){
//关闭session,并返回给前端
customerHandler.closeSession(wsMessage.getBody().getReceiver(), wsMessage);
}

关闭的方法:

/**
* 关闭Session
* @param studentId
* @param closeMessage
*/
public void closeSession(Long studentId,WsMessage closeMessage){
Session session = SOCK_MAP.get(studentId);
if(session!=null) {
try {
session.getBasicRemote().sendObject(closeMessage);
SOCK_MAP.remove(studentId);
//清除redis
logger.info("连接已关闭:" + studentId);
} catch (Exception e) {
e.printStackTrace();
logger.error("关闭连接异常");
}
}
}

这样基本就避免多端登录的问题,如果允许多端登录的时候只需要更改存储,更改发送消息变成群发即可。


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
author-avatar
小遥2502881765
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有