Java?spring?MVC環(huán)境中實現(xiàn)WebSocket的示例代碼
我們先在項目 pom.xml 中注入websocket依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <version>2.5.3</version> </dependency>
然后 我們在 配置文件中加一下配置
我這里用的是yml
參考代碼如下
server: port: 80 spring: cors: allowed-origins: "*" allowed-headers: "*" websocket: enabled: true endpoint: /ws path: /websocket max-text-message-size: 256KB max-binary-message-size: 256KB
端口 80然后 將請求源 和 請求頭信息 設(shè)置為星號 表示 不限制 這樣就不會發(fā)生跨域然后 打開websocket配置限制信息大小
然后 找到啟動類 目錄下面創(chuàng)建一個 config文件夾 用來寫配置文件
然后 在這個目錄下面創(chuàng)建一個 MyWebSocketHandler.java參考代碼如下
import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class MyWebSocketHandler extends TextWebSocketHandler { private static final List<WebSocketSession> sessions = new ArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // 建立連接時觸發(fā) sessions.add(session); System.out.println(sessions); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { System.out.println(session.getId()); // 處理收到的消息 String payload = message.getPayload(); System.out.println(payload); System.out.println(sessions); List<WebSocketSession> filteredSessions = sessions.stream() .filter(item -> session.getId() != item.getId()) .collect(Collectors.toList()); for (WebSocketSession webSocketSession : filteredSessions) { try { webSocketSession.sendMessage(new TextMessage(payload)); // 推送給前端的字符串 } catch (IOException e) { e.printStackTrace(); } } // ... } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { // 關(guān)閉連接時觸發(fā) sessions.remove(session); } }
這個類中寫了websocket的基本配置
首先是 建立連接時觸發(fā) afterConnectionEstablished
這個函數(shù)接收一個參數(shù) 就是當(dāng)前連進來的web應(yīng)用 這個對象中就是 web端的url和websocket給的唯一 連接id
然后 我們用sessions 這個list集合 將連接的信息存起來
然后handleTextMessage 當(dāng)web端發(fā)來數(shù)據(jù)時觸發(fā)
接收兩個參數(shù) session 告訴我們是誰發(fā)的
message 發(fā)來的信息
我們通過
String payload = message.getPayload();
接收信息
然后 輸出在控制臺
然后 我們通過filter對sessions進行過濾
簡單說 條件就是 除了發(fā)信息的人 其他都過濾出來
然后 我們通過
for (WebSocketSession webSocketSession : filteredSessions) { try { webSocketSession.sendMessage(new TextMessage(payload)); // 推送給前端的字符串 } catch (IOException e) { e.printStackTrace(); } }
首先 我們循環(huán)過濾好的list集合
然后一個一個的去發(fā)送消息sendMessage
這個就是 連接對象.sendMessage(new TextMessage(要發(fā)的信息))
然后 afterConnectionClosed 當(dāng)有應(yīng)用斷開連接時觸發(fā) session 告訴你是誰斷開了
然后 我們在這個目錄下創(chuàng)建一個 WebSocketConfig.java
參考代碼如下
import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/websocket").setAllowedOrigins("*"); } }
這里 我們實現(xiàn) WebSocketConfigurer 接口 重寫registerWebSocketHandlers
調(diào)用我們自己寫的 MyWebSocketHandler配置
然后 我們啟動項目
在寫個vue的WebSocket 來測試連接一下
在寫個vue的WebSocket 來測試連接一下
這里 我們看到 前端建立連接成功
而java控制臺 也輸出了我們連接對象的格式 一個連接id 和一個url
然后 這是我的vue代碼
<template> <div> <input type="text" v-model="text" placeholder="請輸入內(nèi)容" ></input> <button @click = "sendData">發(fā)送消息</button> <div v-for = "(item,index) in list" :key = "index">{{ item }}</div> </div> </template> <script> export default { data() { return { ws: null, text: "", list: [] }; }, methods: { sendData() { this.ws.send(this.text) } }, mounted() { this.ws = new WebSocket('ws://localhost/websocket'); this.ws.onopen = () => { console.log('WebSocket連接已建立'); }; this.ws.onmessage = (event) => { this.list.push(event.data); }; this.ws.onclose = () => { console.log('WebSocket連接已關(guān)閉'); }; this.ws.onerror = (error) => { console.log('WebSocket錯誤:', error); }; } }; </script>
大家可以自己開兩個創(chuàng)建試試這個聊天效果 還是挺好玩的
到此這篇關(guān)于Java spring MVC環(huán)境中實現(xiàn)WebSocket的文章就介紹到這了,更多相關(guān)java實現(xiàn)WebSocket內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java實現(xiàn)使用Websocket發(fā)送消息詳細代碼舉例
- 如何在Java中使用WebSocket協(xié)議
- springboot整合websocket后啟動報錯(javax.websocket.server.ServerContainer not available)
- Java實現(xiàn)WebSocket四個步驟
- java中Websocket的使用方法例子
- java基于websocket實現(xiàn)im聊天功能
- Java中實現(xiàn)WebSocket方法詳解
- 教你如何使用Java實現(xiàn)WebSocket
- 一步步教你如何使用Java實現(xiàn)WebSocket
- Java應(yīng)用層協(xié)議WebSocket實現(xiàn)消息推送
- java?WebSocket?服務(wù)端實現(xiàn)代碼
- Java中使用WebSocket的幾種方式
相關(guān)文章
詳解mybatis.generator配上最新的mysql 8.0.11的一些坑
這篇文章主要介紹了詳解mybatis.generator配上最新的mysql 8.0.11的一些坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10Spring boot 連接多數(shù)據(jù)源過程詳解
這篇文章主要介紹了Spring boot 連接多數(shù)據(jù)源過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08Java參數(shù)校驗詳解之使用@Valid注解和自定義注解進行參數(shù)驗證
在后端開發(fā)中,參數(shù)校驗是非常普遍的,下面這篇文章主要給大家介紹了關(guān)于Java參數(shù)校驗詳解之使用@Valid注解和自定義注解進行參數(shù)驗證的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-06-06Java基于ServletContextListener實現(xiàn)UDP監(jiān)聽
這篇文章主要介紹了Java基于ServletContextListener實現(xiàn)UDP監(jiān)聽,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12利用IDEA社區(qū)版創(chuàng)建SpringBoot項目的詳細圖文教程
大家應(yīng)該都知道Idea社區(qū)版本,默認是不能創(chuàng)建SpringBoot項目的,下面這篇文章主要給大家介紹了關(guān)于利用IDEA社區(qū)版創(chuàng)建SpringBoot項目的詳細圖文教程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-04-04SpringBoot啟動時執(zhí)行初始化操作的幾種方式
項目中,經(jīng)常需要在啟動過程中初始化一些數(shù)據(jù),如從數(shù)據(jù)庫讀取一些配置初始化,或從數(shù)據(jù)庫讀取一些熱點數(shù)據(jù)到redis進行初始化緩存,本文給大家介紹了SpringBoot啟動時執(zhí)行初始化操作的幾種方式的相關(guān)資料,需要的朋友可以參考下2024-05-05