Java?spring?MVC環(huán)境中實(shí)現(xiàn)WebSocket的示例代碼
我們先在項(xiàng)目 pom.xml 中注入websocket依賴(lài)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> <version>2.5.3</version> </dependency>
然后 我們?cè)?nbsp;配置文件中加一下配置
我這里用的是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然后 將請(qǐng)求源 和 請(qǐng)求頭信息 設(shè)置為星號(hào) 表示 不限制 這樣就不會(huì)發(fā)生跨域然后 打開(kāi)websocket配置限制信息大小
然后 找到啟動(dòng)類(lèi) 目錄下面創(chuàng)建一個(gè) config文件夾 用來(lái)寫(xiě)配置文件
然后 在這個(gè)目錄下面創(chuàng)建一個(gè) 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 { // 建立連接時(shí)觸發(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)閉連接時(shí)觸發(fā) sessions.remove(session); } }
這個(gè)類(lèi)中寫(xiě)了websocket的基本配置
首先是 建立連接時(shí)觸發(fā) afterConnectionEstablished
這個(gè)函數(shù)接收一個(gè)參數(shù) 就是當(dāng)前連進(jìn)來(lái)的web應(yīng)用 這個(gè)對(duì)象中就是 web端的url和websocket給的唯一 連接id
然后 我們用sessions 這個(gè)list集合 將連接的信息存起來(lái)
然后handleTextMessage 當(dāng)web端發(fā)來(lái)數(shù)據(jù)時(shí)觸發(fā)
接收兩個(gè)參數(shù) session 告訴我們是誰(shuí)發(fā)的
message 發(fā)來(lái)的信息
我們通過(guò)
String payload = message.getPayload();
接收信息
然后 輸出在控制臺(tái)
然后 我們通過(guò)filter對(duì)sessions進(jìn)行過(guò)濾
簡(jiǎn)單說(shuō) 條件就是 除了發(fā)信息的人 其他都過(guò)濾出來(lái)
然后 我們通過(guò)
for (WebSocketSession webSocketSession : filteredSessions) { try { webSocketSession.sendMessage(new TextMessage(payload)); // 推送給前端的字符串 } catch (IOException e) { e.printStackTrace(); } }
首先 我們循環(huán)過(guò)濾好的list集合
然后一個(gè)一個(gè)的去發(fā)送消息sendMessage
這個(gè)就是 連接對(duì)象.sendMessage(new TextMessage(要發(fā)的信息))
然后 afterConnectionClosed 當(dāng)有應(yīng)用斷開(kāi)連接時(shí)觸發(fā) session 告訴你是誰(shuí)斷開(kāi)了
然后 我們?cè)谶@個(gè)目錄下創(chuàng)建一個(gè) 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("*"); } }
這里 我們實(shí)現(xiàn) WebSocketConfigurer 接口 重寫(xiě)registerWebSocketHandlers
調(diào)用我們自己寫(xiě)的 MyWebSocketHandler配置
然后 我們啟動(dòng)項(xiàng)目
在寫(xiě)個(gè)vue的WebSocket 來(lái)測(cè)試連接一下
在寫(xiě)個(gè)vue的WebSocket 來(lái)測(cè)試連接一下
這里 我們看到 前端建立連接成功
而java控制臺(tái) 也輸出了我們連接對(duì)象的格式 一個(gè)連接id 和一個(gè)url
然后 這是我的vue代碼
<template> <div> <input type="text" v-model="text" placeholder="請(qǐng)輸入內(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錯(cuò)誤:', error); }; } }; </script>
大家可以自己開(kāi)兩個(gè)創(chuàng)建試試這個(gè)聊天效果 還是挺好玩的
到此這篇關(guān)于Java spring MVC環(huán)境中實(shí)現(xiàn)WebSocket的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)WebSocket內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java實(shí)現(xiàn)使用Websocket發(fā)送消息詳細(xì)代碼舉例
- 如何在Java中使用WebSocket協(xié)議
- springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerContainer not available)
- Java實(shí)現(xiàn)WebSocket四個(gè)步驟
- java中Websocket的使用方法例子
- java基于websocket實(shí)現(xiàn)im聊天功能
- Java中實(shí)現(xiàn)WebSocket方法詳解
- 教你如何使用Java實(shí)現(xiàn)WebSocket
- 一步步教你如何使用Java實(shí)現(xiàn)WebSocket
- Java應(yīng)用層協(xié)議WebSocket實(shí)現(xiàn)消息推送
- java?WebSocket?服務(wù)端實(shí)現(xiàn)代碼
- Java中使用WebSocket的幾種方式
相關(guān)文章
詳解mybatis.generator配上最新的mysql 8.0.11的一些坑
這篇文章主要介紹了詳解mybatis.generator配上最新的mysql 8.0.11的一些坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10Spring boot 連接多數(shù)據(jù)源過(guò)程詳解
這篇文章主要介紹了Spring boot 連接多數(shù)據(jù)源過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Java參數(shù)校驗(yàn)詳解之使用@Valid注解和自定義注解進(jìn)行參數(shù)驗(yàn)證
在后端開(kāi)發(fā)中,參數(shù)校驗(yàn)是非常普遍的,下面這篇文章主要給大家介紹了關(guān)于Java參數(shù)校驗(yàn)詳解之使用@Valid注解和自定義注解進(jìn)行參數(shù)驗(yàn)證的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06java BASE64Encoder詳細(xì)介紹及簡(jiǎn)單實(shí)例
這篇文章主要介紹了java BASE64Encoder詳細(xì)介紹及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-01-01Java基于ServletContextListener實(shí)現(xiàn)UDP監(jiān)聽(tīng)
這篇文章主要介紹了Java基于ServletContextListener實(shí)現(xiàn)UDP監(jiān)聽(tīng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12SpringBoot實(shí)現(xiàn)微信小程序支付功能
小程序支付功能已成為眾多應(yīng)用的核心需求之一,本文主要介紹了SpringBoot實(shí)現(xiàn)微信小程序支付功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04利用IDEA社區(qū)版創(chuàng)建SpringBoot項(xiàng)目的詳細(xì)圖文教程
大家應(yīng)該都知道Idea社區(qū)版本,默認(rèn)是不能創(chuàng)建SpringBoot項(xiàng)目的,下面這篇文章主要給大家介紹了關(guān)于利用IDEA社區(qū)版創(chuàng)建SpringBoot項(xiàng)目的詳細(xì)圖文教程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04SpringBoot啟動(dòng)時(shí)執(zhí)行初始化操作的幾種方式
項(xiàng)目中,經(jīng)常需要在啟動(dòng)過(guò)程中初始化一些數(shù)據(jù),如從數(shù)據(jù)庫(kù)讀取一些配置初始化,或從數(shù)據(jù)庫(kù)讀取一些熱點(diǎn)數(shù)據(jù)到redis進(jìn)行初始化緩存,本文給大家介紹了SpringBoot啟動(dòng)時(shí)執(zhí)行初始化操作的幾種方式的相關(guān)資料,需要的朋友可以參考下2024-05-05