15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > springboot5分钟快速搭建WEBSCOKET聊天室

springboot5分钟快速搭建WEBSCOKET聊天室

时间:2023-07-22 09:45:01 | 来源:网站运营

时间:2023-07-22 09:45:01 来源:网站运营

springboot5分钟快速搭建WEBSCOKET聊天室:Websocket 聊天室

Websocket 双相通讯的特性⾮常适合开发在线聊天室,这⾥以在线多⼈聊天室为示例,演示 Spring Boot Websocket 的使⽤。

⾸先我们梳理⼀下聊天室都有什么功能:

  1. ⽀持⽤户加⼊聊天室,对应到 Websocket 技术就是建⽴连接 onopen
  2. ⽀持⽤户退出聊天室,对应到 Websocket 技术就是关闭连接 onclose
  3. ⽀持⽤户在聊天室发送消息,对应到 Websocket 技术就是调⽤ onmessage 发送消息
  4. ⽀持异常时提示,对应到 Websocket 技术 onerror
页面开发

利⽤前端框架 Bootstrap 渲染⻚⾯,使⽤ HTML 搭建⻚⾯结构,完整⻚⾯内容如下:

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>chat room websocket</title> <link rel="stylesheet" href="bootstrap.min.css"> <script src="jquery-3.2.1.min.js" ></script></head><body class="container" style="width: 60%"><div class="form-group" ></br> <h5>聊天室</h5> <textarea id="message_content" class="form-control" readonly="readonly" cols="50" rows="10"></textarea></div><div class="form-group" > <label for="in_user_name">用户姓名 &nbsp;</label> <input id="in_user_name" value="" class="form-control" /></br> <button id="user_join" class="btn btn-success" >加入聊天室</button> <button id="user_exit" class="btn btn-warning" >离开聊天室</button></div><div class="form-group" > <label for="in_room_msg" >群发消息 &nbsp;</label> <input id="in_room_msg" value="" class="form-control" /></br> <button id="user_send_all" class="btn btn-info" >发送消息</button></div></body><script type="text/javascript"> $(document).ready(function(){ var urlPrefix ='ws://localhost:8080/chat-room/'; var ws = null; $('#user_join').click(function(){ var username = $('#in_user_name').val(); if(username==''){ alert("请输入用户名!"); return; } var url = urlPrefix + username; ws = new WebSocket(url); ws.onopen = function () { console.log("建立 websocket 连接..."); }; ws.onmessage = function(event){ //服务端发送的消息 $('#message_content').append(event.data+'/n'); }; ws.onclose = function(){ $('#message_content').append('用户['+username+'] 已经离开聊天室!'); console.log("关闭 websocket 连接..."); } }); //客户端发送消息到服务器 $('#user_send_all').click(function(){ var msg = $('#in_room_msg').val(); if(msg==''){ alert("请填写消息!"); return; } if(ws && msg!=''){ ws.send(msg); } }); // 退出聊天室 $('#user_exit').click(function(){ if(ws){ ws.close(); } }); })</script></html>这两个文件没有的可以直接私聊我。

jquery-3.2.1.min.jsbootstrap.min.css


最上⾯使⽤ textarea 画⼀个对话框,⽤来显示聊天室的内容;中间部分添加⽤户加⼊聊天室和离开聊天室的按钮,

按钮上⾯是输⼊⽤户名的⼊⼝;⻚⾯最下⾯添加发送消息的⼊⼝,⻚⾯显示效果如下:

服务端开发

引⼊依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId></dependency>主要添加 Web 和 Websocket 组件。

启动类

启动类需要添加 @EnableWebSocket 开启 WebSocket 功能。

@EnableWebSocket@SpringBootApplicationpublic class WebSocketApplication { public static void main(String[] args) { SpringApplication.run(WebSocketApplication.class, args); } @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }}请求接收

在创建服务端消息接收功能之前,我们先创建⼀个 WebSocketUtils ⼯具类,⽤来存储聊天室在线的⽤户信息,以 及发送消息的功能。⾸先定义⼀个全局变量 ONLINE_USER_SESSIONS ⽤来存储在线⽤户,使⽤ ConcurrentHashMap 提升⾼并发时效率。

创建⼀个 ⼯具类

package com.neo.utils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.websocket.RemoteEndpoint;import javax.websocket.Session;import java.io.IOException;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public final class WebSocketUtils { private static final Logger logger = LoggerFactory.getLogger(WebSocketUtils.class); // 存储 websocket session public static final Map<String, Session> ONLINE_USER_SESSIONS = new ConcurrentHashMap<>(); /** * @param session 用户 session * @param message 发送内容 */ public static void sendMessage(Session session, String message) { if (session == null) { return; } final RemoteEndpoint.Basic basic = session.getBasicRemote(); if (basic == null) { return; } try { basic.sendText(message); } catch (IOException e) { logger.error("sendMessage IOException ",e); } } public static void sendMessageAll(String message) { ONLINE_USER_SESSIONS.forEach((sessionId, session) -> sendMessage(session, message)); }}这样我们在创建 ChatRoomServerEndpoint 类的时候就可以直接将⼯具类的⽅法和全局变量导⼊:

接收类上需要添加 @ServerEndpoint("url") 代表监听此地址的 WebSocket 信息。

创建接收类

package com.neo;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.RestController;import javax.websocket.*;import javax.websocket.server.PathParam;import javax.websocket.server.ServerEndpoint;import java.io.IOException;import static com.neo.utils.WebSocketUtils.ONLINE_USER_SESSIONS;import static com.neo.utils.WebSocketUtils.sendMessageAll;@RestController@ServerEndpoint("/chat-room/{username}")public class ChatRoomServerEndpoint { private static final Logger logger = LoggerFactory.getLogger(ChatRoomServerEndpoint.class); @OnOpen public void openSession(@PathParam("username") String username, Session session) { ONLINE_USER_SESSIONS.put(username, session); String message = "欢迎用户[" + username + "] 来到聊天室!"; logger.info("用户登录:"+message); sendMessageAll(message); } @OnMessage public void onMessage(@PathParam("username") String username, String message) { logger.info("发送消息:"+message); sendMessageAll("用户[" + username + "] : " + message); } @OnClose public void onClose(@PathParam("username") String username, Session session) { //当前的Session 移除 ONLINE_USER_SESSIONS.remove(username); //并且通知其他人当前用户已经离开聊天室了 sendMessageAll("用户[" + username + "] 已经离开聊天室了!"); try { session.close(); } catch (IOException e) { logger.error("onClose error",e); } } @OnError public void onError(Session session, Throwable throwable) { try { session.close(); } catch (IOException e) { logger.error("onError excepiton",e); } logger.info("Throwable msg "+throwable.getMessage()); }}啥这就完成了?没错 !

开始测试

启动 spring-boot-websocket 项⽬,在浏览器中输⼊地址 http://localhost:8080/ 打开两个⻚⾯进⾏测试。

在第⼀个⻚⾯中以⽤户“⼩王”登录聊天室,第⼆个⻚⾯以“⼩张”登录聊天室。

⼤家在两个⻚⾯模式⼩王和⼩张对话,可以看到两个⻚⾯的展示效果,⻚⾯都可实时⽆刷新展示最新聊天内容,⻚

⾯最终展示效果如下:



关键词:

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭