使用websocket建立双向连接,进行消息接收发送。
服务器:java
前端web框加:vue
app:uni-app
一对一聊天
通常单对单聊天过程是A、B两个客户端建立连接,相互发送和接收消息。这是聊天系统的第一步尝试,假设两个客户端可以互通,也就是相互通过IP可以访问对方,那么直接在前端建立websocket连接后就可以相互发送消息,需要自定义编码处理的就是接收消息后的处理方法和发送消息功能的触发。
多对多聊天
事实上,通常两个客户端是没有办法直接通过IP互联的,比如我们的电脑,使用的家庭宽带,内网IP,一个区域公用一个公网IP,可以联网,但是外网不能主动访问到你的机器,这就使得初步设计的聊天方案无法实行,另外我们需要的多人聊天,类似一张网,一个节点连接无数个节点,同时进行消息交互。为此,我们需要加上服务端,类似电视电影中的老式电话,呼叫服务台,帮你转接指定目标。
加入服务端后,客户端A、B不进行直接互联,都统服务器连接。而服务器不主动连接客户端,同样因为IP问题,服务器不能找到客户端地址。客户端联网登录,主动发起websocket连接申请,建立与服务器间的连接通道,此时服务器和客户端都可以主动发送消息给对方和接收对方消息。不仅如此,连接建立后,服务器可以把多个客户端的消息同时发送给一个客户端,也就实现了用户A同时和多人聊天,只需要在消息结构中处理好消息发送来源,标识每条消息是谁发送的,在展示给用户的时候作好分组。
整体上的聊天系统,依靠三方就能实现,继续细化服务器端的内容,需要解决的问题是:服务器接收到客户端消息后,如何准确找到消息要送达的目标客户端。分三步:
· 服务器保存所有websocket连接实例
· 拆分消息体,获取目标客户端标识
· 根据标识从保存的实例中匹配连接
保存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,需要用到的注解。