本文将通过搭建一个一对一聊天服务器,深入学习更多的socket知识。
1、发送消息
在前面我们写了一个自动回复的小例子,用到了和两个注解,其实我们还可以使用编程的方式发送消息。
其实很简单,直接引用该消息模板
消息模板内置了一系列方法,比如
这俩方法会包装为消息并将其发送到给定的目的地。
2、STOMP监听
监听webSocket服务器的连接只需要实现ApplicationListener接口。代码如下:
监听的所有状态被封装在一个枚举类中,其实还有很多,这里不再一一列举。
有了上面这些知识,我们就可以基于此开发一对一聊天服务器。
3、Session存取
webSocket提供的是一个socket框架,并不会帮我们管理session,我们需要自己去编写session管理类,进行session的读写。代码如下:
4、监听注册
接着,对STOMP监听类进行扩展。
服务端通过读取到客户端的ID,这个值需要网页客户端手动在header头部信息中设置。
当服务端监听到客户端连接时,会将用户SessionId注册到Map中。
5、监听下线
这里我们使用更可靠的请求下线方式,代码如下:
当收到下线请求时,移除SessionId。
关于Session,也可以设置一个最大值,超时自动移除。
6、一对一消息处理
在一对一服务器中,主要处理的就是一对一的消息发送。大致逻辑是接收客户端消息,分析消息结构,通过SessionMap判断对方是否在线,然后发送相应内容。代码如下:
值得一体的是,关于用户ID的处理,这里使用的是自定义客户端地址,不同的地址表示不同的用户。最后通过convertAndSend()方法发送,这种方式比较可靠方便。
Message.java
7、聊天网页
服务端使用FreeMarker模板引擎返回html网页,代码如下:
通过RESTful形式的URl注册ID。
chat.html
chat.js
网页客户端的主要逻辑在chat.js中。非常有必要的是在stompClient.connect()方法的第一个参数中传入header头信息,该头部信息必须设置id字段的值,因为服务端会读取该ID值,该值最终会取自URL中的参数。
其次是在用户断开链接前,会向服务端发送断开通知。
8、程序演示
打开两个网页,URl分别为和,点击连接。
查看控制台输出:
接下来演示用户101向用户100发送消息:
查看用户100收到信息:
再次查看控制输出:
消息成功发送!
当用户断开链接时,控制台输出为:
关注后端技术精选,每天推送优质好文
领取专属 10元无门槛券
私享最新 技术干货