Websocket 雙相通訊的特性?常適合開發(fā)在線聊天室,這?以在線多?聊天室為示例,演示 Spring Boot Websocket 的使?。

?先我們梳理?下聊天室都有什么功能:" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > springboot5分鐘快速搭建WEBSCOKET聊天室

springboot5分鐘快速搭建WEBSCOKET聊天室

時間:2023-07-22 09:45:01 | 來源:網(wǎng)站運營

時間:2023-07-22 09:45:01 來源:網(wǎng)站運營

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

Websocket 雙相通訊的特性?常適合開發(fā)在線聊天室,這?以在線多?聊天室為示例,演示 Spring Boot Websocket 的使?。

?先我們梳理?下聊天室都有什么功能:

  1. ?持?戶加?聊天室,對應(yīng)到 Websocket 技術(shù)就是建?連接 onopen
  2. ?持?戶退出聊天室,對應(yīng)到 Websocket 技術(shù)就是關(guān)閉連接 onclose
  3. ?持?戶在聊天室發(fā)送消息,對應(yīng)到 Websocket 技術(shù)就是調(diào)? onmessage 發(fā)送消息
  4. ?持異常時提示,對應(yīng)到 Websocket 技術(shù) onerror
頁面開發(fā)

利?前端框架 Bootstrap 渲染??,使? HTML 搭建??結(jié)構(gòu),完整??內(nèi)容如下:

<!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" >群發(fā)消息 &nbsp;</label> <input id="in_room_msg" value="" class="form-control" /></br> <button id="user_send_all" class="btn btn-info" >發(fā)送消息</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){ //服務(wù)端發(fā)送的消息 $('#message_content').append(event.data+'/n'); }; ws.onclose = function(){ $('#message_content').append('用戶['+username+'] 已經(jīng)離開聊天室!'); console.log("關(guān)閉 websocket 連接..."); } }); //客戶端發(fā)送消息到服務(wù)器 $('#user_send_all').click(function(){ var msg = $('#in_room_msg').val(); if(msg==''){ alert("請?zhí)顚懴ⅲ?#34;); 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 畫?個對話框,?來顯示聊天室的內(nèi)容;中間部分添加?戶加?聊天室和離開聊天室的按鈕,

按鈕上?是輸??戶名的??;??最下?添加發(fā)送消息的??,??顯示效果如下:

服務(wù)端開發(fā)

引?依賴

<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(); }}請求接收

在創(chuàng)建服務(wù)端消息接收功能之前,我們先創(chuàng)建?個 WebSocketUtils ?具類,?來存儲聊天室在線的?戶信息,以 及發(fā)送消息的功能。?先定義?個全局變量 ONLINE_USER_SESSIONS ?來存儲在線?戶,使? ConcurrentHashMap 提升?并發(fā)時效率。

創(chuàng)建?個 ?具類

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 發(fā)送內(nèi)容 */ 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)); }}這樣我們在創(chuàng)建 ChatRoomServerEndpoint 類的時候就可以直接將?具類的?法和全局變量導(dǎo)?:

接收類上需要添加 @ServerEndpoint("url") 代表監(jiān)聽此地址的 WebSocket 信息。

創(chuàng)建接收類

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("發(fā)送消息:"+message); sendMessageAll("用戶[" + username + "] : " + message); } @OnClose public void onClose(@PathParam("username") String username, Session session) { //當(dāng)前的Session 移除 ONLINE_USER_SESSIONS.remove(username); //并且通知其他人當(dāng)前用戶已經(jīng)離開聊天室了 sendMessageAll("用戶[" + username + "] 已經(jīng)離開聊天室了!"); 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/ 打開兩個??進(jìn)?測試。

在第?個??中以?戶“?王”登錄聊天室,第?個??以“?張”登錄聊天室。

?家在兩個??模式?王和?張對話,可以看到兩個??的展示效果,??都可實時?刷新展示最新聊天內(nèi)容,?

?最終展示效果如下:



關(guān)鍵詞:

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉