Spring Boot 开发私有即时通信系统(WebSocket)
程序员文章站
2024-02-27 23:59:39
1/ 概述
利用spring boot作为基础框架,spring security作为安全框架,websocket作为通信框架,实现点对点聊天和群聊天。
2/ 所需依赖...
1/ 概述
利用spring boot作为基础框架,spring security作为安全框架,websocket作为通信框架,实现点对点聊天和群聊天。
2/ 所需依赖
spring boot 版本 1.5.3,使用mongodb存储数据(非必须),maven依赖如下:
<properties> <java.version>1.8</java.version> <thymeleaf.version>3.0.0.release</thymeleaf.version> <thymeleaf-layout-dialect.version>2.0.0</thymeleaf-layout-dialect.version> </properties> <dependencies> <!-- websocket依赖,移除tomcat容器 --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-websocket</artifactid> <exclusions> <exclusion> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-tomcat</artifactid> </exclusion> </exclusions> </dependency> <!-- 使用undertow容器 --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-undertow</artifactid> </dependency> <!-- spring security 框架 --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-security</artifactid> </dependency> <!-- mongodb数据库 --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-mongodb</artifactid> </dependency> <!-- thymeleaf 模版引擎 --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-thymeleaf</artifactid> </dependency> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.16.16</version> </dependency> <dependency> <groupid>com.alibaba</groupid> <artifactid>fastjson</artifactid> <version>1.2.30</version> </dependency> <!-- 静态资源 --> <dependency> <groupid>org.webjars</groupid> <artifactid>webjars-locator</artifactid> </dependency> <dependency> <groupid>org.webjars</groupid> <artifactid>sockjs-client</artifactid> <version>1.0.2</version> </dependency> <dependency> <groupid>org.webjars</groupid> <artifactid>stomp-websocket</artifactid> <version>2.3.3</version> </dependency> <dependency> <groupid>org.webjars</groupid> <artifactid>bootstrap</artifactid> <version>3.3.7</version> </dependency> <dependency> <groupid>org.webjars</groupid> <artifactid>jquery</artifactid> <version>3.1.0</version> </dependency> </dependencies>
配置文件内容:
server: port: 80 # 若使用mongodb则配置如下参数 spring: data: mongodb: uri: mongodb://username:password@172.25.11.228:27017 authentication-database: admin database: chat
大致程序结构,仅供参考:
3/ 创建程序启动类,启用websocket
使用@enablewebsocket
注解
@springbootapplication @enablewebsocket public class application { public static void main(string[] args) { springapplication.run(application.class, args); } }
4/ 配置spring security
此章节省略。(配置好spring security,用户能正常登录即可)
5/ 配置web socket(结合第7节的js看)
@configuration @enablewebsocketmessagebroker @log4j public class websocketconfig extends abstractwebsocketmessagebrokerconfigurer { // 此处可注入自己写的service @override public void registerstompendpoints(stompendpointregistry stompendpointregistry) { // 客户端与服务器端建立连接的点 stompendpointregistry.addendpoint("/any-socket").withsockjs(); } @override public void configuremessagebroker(messagebrokerregistry messagebrokerregistry) { // 配置客户端发送信息的路径的前缀 messagebrokerregistry.setapplicationdestinationprefixes("/app"); messagebrokerregistry.enablesimplebroker("/topic"); } @override public void configurewebsockettransport(final websockettransportregistration registration) { registration.adddecoratorfactory(new websockethandlerdecoratorfactory() { @override public websockethandler decorate(final websockethandler handler) { return new websockethandlerdecorator(handler) { @override public void afterconnectionestablished(final websocketsession session) throws exception { // 客户端与服务器端建立连接后,此处记录谁上线了 string username = session.getprincipal().getname(); log.info("online: " + username); super.afterconnectionestablished(session); } @override public void afterconnectionclosed(websocketsession session, closestatus closestatus) throws exception { // 客户端与服务器端断开连接后,此处记录谁下线了 string username = session.getprincipal().getname(); log.info("offline: " + username); super.afterconnectionclosed(session, closestatus); } }; } }); super.configurewebsockettransport(registration); } }
6/ 点对点消息,群消息
@controller @log4j public class chatcontroller { @autowired private simpmessagingtemplate template; // 注入其它service // 群聊天 @messagemapping("/notice") public void notice(principal principal, string message) { // 参数说明 principal 当前登录的用户, message 客户端发送过来的内容 // principal.getname() 可获得当前用户的username // 发送消息给订阅 "/topic/notice" 且在线的用户 template.convertandsend("/topic/notice", message); } // 点对点聊天 @messagemapping("/chat") public void chat(principal principal, string message){ // 参数说明 principal 当前登录的用户, message 客户端发送过来的内容(应该至少包含发送对象touser和消息内容content) // principal.getname() 可获得当前用户的username // 发送消息给订阅 "/user/topic/chat" 且用户名为touser的用户 template.convertandsendtouser(touser, "/topic/chat", content); } }
7/ 客户端与服务器端交互
var stompclient = null; function connect() { var socket = new sockjs('/any-socket'); stompclient = stomp.over(socket); stompclient.connect({}, function (frame) { // 订阅 /topic/notice 实现群聊 stompclient.subscribe('/topic/notice', function (message) { showmessage(json.parse(message.body)); }); // 订阅 /user/topic/chat 实现点对点聊 stompclient.subscribe('/user/topic/chat', function (message) { showmessage(json.parse(message.body)); }); }); } function showmessage(message) { // 处理消息在页面的显示 } $(function () { // 建立websocket连接 connect(); // 发送消息按钮事件 $("#send").click(function () { if (target == "to_all"){ // 群发消息 // 匹配后端chatcontroller中的 @messagemapping("/notice") stompclient.send("/app/notice", {}, '消息内容'); }else{ // 点对点消息,消息中必须包含对方的username // 匹配后端chatcontroller中的 @messagemapping("/chat") var content = "{'content':'消息内容','receiver':'anoy'}"; stompclient.send("/app/chat", {}, content); } }); });
8/ 效果测试
登录三个用户:anoyi、jock、超级管理员。
群消息测试,超级管理员群发消息:
点对点消息测试,anoyi给jock发送消息,只有jock收到消息,anoyi和超级管理员收不到消息:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: sentry安装过程中遇到的坑
下一篇: 开发过程中遇到的坑:java篇