Java?spring?MVC環(huán)境中實(shí)現(xiàn)WebSocket的示例代碼
我們先在項(xiàng)目 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è)置為星號(hào) 表示 不限制 這樣就不會(huì)發(fā)生跨域然后 打開websocket配置限制信息大小

然后 找到啟動(dòng)類 目錄下面創(chuàng)建一個(gè) config文件夾 用來寫配置文件

然后 在這個(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è)類中寫了websocket的基本配置
首先是 建立連接時(shí)觸發(fā) afterConnectionEstablished
這個(gè)函數(shù)接收一個(gè)參數(shù) 就是當(dāng)前連進(jìn)來的web應(yīng)用 這個(gè)對象中就是 web端的url和websocket給的唯一 連接id
然后 我們用sessions 這個(gè)list集合 將連接的信息存起來
然后handleTextMessage 當(dāng)web端發(fā)來數(shù)據(jù)時(shí)觸發(fā)
接收兩個(gè)參數(shù) session 告訴我們是誰發(fā)的
message 發(fā)來的信息
我們通過
String payload = message.getPayload();
接收信息
然后 輸出在控制臺(tái)
然后 我們通過filter對sessions進(jìn)行過濾
簡單說 條件就是 除了發(fā)信息的人 其他都過濾出來
然后 我們通過
for (WebSocketSession webSocketSession : filteredSessions) {
try {
webSocketSession.sendMessage(new TextMessage(payload)); // 推送給前端的字符串
} catch (IOException e) {
e.printStackTrace();
}
}首先 我們循環(huán)過濾好的list集合
然后一個(gè)一個(gè)的去發(fā)送消息sendMessage
這個(gè)就是 連接對象.sendMessage(new TextMessage(要發(fā)的信息))
然后 afterConnectionClosed 當(dāng)有應(yīng)用斷開連接時(shí)觸發(fā) session 告訴你是誰斷開了
然后 我們在這個(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 接口 重寫registerWebSocketHandlers
調(diào)用我們自己寫的 MyWebSocketHandler配置
然后 我們啟動(dòng)項(xiàng)目
在寫個(gè)vue的WebSocket 來測試連接一下
在寫個(gè)vue的WebSocket 來測試連接一下

這里 我們看到 前端建立連接成功

而java控制臺(tái) 也輸出了我們連接對象的格式 一個(gè)連接id 和一個(gè)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錯(cuò)誤:', error);
};
}
};
</script>大家可以自己開兩個(gè)創(chuàng)建試試這個(gè)聊天效果 還是挺好玩的


到此這篇關(guān)于Java spring MVC環(huán)境中實(shí)現(xiàn)WebSocket的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)WebSocket內(nèi)容請搜索腳本之家以前的文章或繼續(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)文章
Tomcat報(bào)錯(cuò):HTTP Status 500 (Wrapper cannot find servlet class)
這篇文章主要介紹了Tomcat報(bào)錯(cuò):HTTP Status 500 (Wrapper cannot find servlet class)解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11
詳解Java集合類之HashTable,Properties篇
這篇文章主要為大家詳細(xì)介紹一下Java集合類中HashTable和Properties的用法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定幫助,感興趣的可以了解一下2022-07-07
解決grails服務(wù)端口沖突的辦法(grails修改端口號(hào))
grails中默認(rèn)的服務(wù)端口為8080,當(dāng)本機(jī)中需要同時(shí)啟動(dòng)兩個(gè)不同的項(xiàng)目時(shí),就會(huì)造成端口沖突,下面給出解決方法2013-12-12
使用Java Servlet生成動(dòng)態(tài)二維碼的實(shí)現(xiàn)步驟
在現(xiàn)代互聯(lián)網(wǎng)時(shí)代,二維碼廣泛應(yīng)用于各個(gè)領(lǐng)域,包括支付、認(rèn)證、信息傳遞等,在Web開發(fā)中,通過Java Servlet生成動(dòng)態(tài)二維碼是一個(gè)常見的需求,本文將介紹如何使用Java Servlet結(jié)合Google的ZXing庫生成動(dòng)態(tài)二維碼,需要的朋友可以參考下2023-11-11
Java?list如何實(shí)現(xiàn)將指定元素排在第一位
這篇文章主要為大家詳細(xì)介紹了Java?list中如何實(shí)現(xiàn)將指定元素排在第一位,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
Java volatile 關(guān)鍵字介紹與使用示例詳解
這篇文章詳細(xì)介紹了Java中的volatile關(guān)鍵字,包括它的核心特性、如何保證變量的可見性和有序性,以及它在解決多線程問題中的局限性,文章通過示例展示了如何在實(shí)際編程中使用volatile,并解釋了如何通過其他同步機(jī)制來彌補(bǔ)volatile的不足,感興趣的朋友一起看看吧2025-01-01

