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

javawebsocket_websocket实时聊天设计

使用websocket建立双向连接,进行消息接收发送。服务器:java前端web框加:vueapp:uni-app一对一聊天

使用websocket建立双向连接,进行消息接收发送。

服务器:java

前端web框加:vue

app:uni-app

一对一聊天

通常单对单聊天过程是A、B两个客户端建立连接,相互发送和接收消息。这是聊天系统的第一步尝试,假设两个客户端可以互通,也就是相互通过IP可以访问对方,那么直接在前端建立websocket连接后就可以相互发送消息,需要自定义编码处理的就是接收消息后的处理方法和发送消息功能的触发。

9728e2cdcf011e6c2cbd59ce0179209a.png

多对多聊天

事实上,通常两个客户端是没有办法直接通过IP互联的,比如我们的电脑,使用的家庭宽带,内网IP,一个区域公用一个公网IP,可以联网,但是外网不能主动访问到你的机器,这就使得初步设计的聊天方案无法实行,另外我们需要的多人聊天,类似一张网,一个节点连接无数个节点,同时进行消息交互。为此,我们需要加上服务端,类似电视电影中的老式电话,呼叫服务台,帮你转接指定目标。

66920d082ddcba6b1fae79b21aef68ee.png

加入服务端后,客户端A、B不进行直接互联,都统服务器连接。而服务器不主动连接客户端,同样因为IP问题,服务器不能找到客户端地址。客户端联网登录,主动发起websocket连接申请,建立与服务器间的连接通道,此时服务器和客户端都可以主动发送消息给对方和接收对方消息。不仅如此,连接建立后,服务器可以把多个客户端的消息同时发送给一个客户端,也就实现了用户A同时和多人聊天,只需要在消息结构中处理好消息发送来源,标识每条消息是谁发送的,在展示给用户的时候作好分组。

整体上的聊天系统,依靠三方就能实现,继续细化服务器端的内容,需要解决的问题是:服务器接收到客户端消息后,如何准确找到消息要送达的目标客户端。分三步:

· 服务器保存所有websocket连接实例

· 拆分消息体,获取目标客户端标识

· 根据标识从保存的实例中匹配连接

31116b81b13ffe75c648c65f24e45456.png

保存websocket连接实例

websocket每次连接都会新创建实例,后台需要保存这些实例,并为每个实例加上标识,标明连接是哪个用户建立的,供后期使用查找。java可以使用map和list,map可以通过key值快速定位,list需要循环匹配,消耗时间。以HashMap为例保存连接实例。假设每个用户都需要登录后才能建立连接,每个登录用户都配备一个token作为唯一登录标识,以token为map的key,建立公共静态变量,类型HashMap。这样每建立一个连接,就往Map中加入一个元素。

拆分消息体,获取目标客户

服务端接收的消息为String类型(类型可以设置),Json结构,后台转化为Json类型后,按照预先设计的结构,从json中获取token。

匹配连接,发送消息

承接上一步,用token获取到map中的实例,先判断session是否有效,有效则表示服务器与客户端的连接还保持着,客户端可以接收服务器消息,服务器可以直接发送消息内容。如果session无效或者查不到连接,则需要后台处理,保存未读消息。

java使用websocket

在springBoot中使用websocket,需要用到的注解。

044ef6052e5c749bce5666bab93a11fd.png



推荐阅读
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 在package.json中有如下两个对象:husky:{hooks:{pre-commit:lint-staged}},lint-staged:{src** ... [详细]
author-avatar
武艺最新单曲问月008
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有