SpringBoot集成WebSocket的兩種方式(JDK內(nèi)置版和Spring封裝版)
本站在2014年4月時(shí)曾全面的學(xué)習(xí)HTML5的技術(shù),特寫(xiě)過(guò)HTML5的WebSocket示例,當(dāng)時(shí)使用的Servlet3.0規(guī)范中的API,需要Tomcat7的支持(貌似在Tomcat6的后期維護(hù)版本也增加了WebSocket的支持),早在當(dāng)初該示例還是本站的一個(gè)特色功能,好多來(lái)找我要源碼的呢。時(shí)隔多年再來(lái)使用SpringBoot架構(gòu)來(lái)體驗(yàn)一下集成WebSocket的實(shí)現(xiàn),經(jīng)過(guò)一番資料的百科大概有找到使用兩種方式的實(shí)現(xiàn),我分別對(duì)它們進(jìn)行了實(shí)踐,所以我稱這兩種方式為JDK內(nèi)置版和Spring封裝版。
1.JDK內(nèi)置版
主要是使用javax.websocket包下的注解進(jìn)行集成,主要有:ServerEndpoint、OnOpen、OnMessage、OnClose、OnError相關(guān)的類和注解來(lái)集成,整體上比較簡(jiǎn)單,都是基于注解定義的方法來(lái)聲明的,參考如下代碼所示:
JdkWebSocket
package cn.chendd.websocket.jdk;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
/**
* websocket實(shí)現(xiàn)
*
* @date 2023/6/2 21:02
*/
@Component
@ServerEndpoint(value = "/websocket/jdk")
public class JdkWebSocket {
@OnOpen
public void onOpen(Session session) {
System.out.println("WebSocketConfig.onOpen");
}
@OnMessage
public void onMessage(Session session , String message) {
System.out.println("WebSocketConfig.onMessage-->" + session + "--->" + message);
}
@OnClose
public void onClose() {
System.out.println("WebSocketConfig.onClose");
}
@OnError
public void onError(Session sesison , Throwable throwable) {
System.out.println("WebSocketConfig.onError-->" + sesison + "--->" + throwable);
}
}JdkWebSocketConfig
package cn.chendd.websocket.jdk;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* @author chendd
* @date 2023/6/2 21:15
*/
@Configuration
public class JdkWebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}運(yùn)行結(jié)果

2.Spring封裝版
Spring封裝版本有對(duì)于消息類型進(jìn)行封裝,提供了更加全面的WebSocket方面的API,值得深入分析。
SpringWebSocketHandler
package cn.chendd.websocket.spring;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.*;
import org.springframework.web.socket.handler.TextWebSocketHandler;
/**
* SpringWebSocketHandler
*
* @author chendd
* @date 2023/6/2 22:08
*/
@Component
public class SpringWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
super.afterConnectionEstablished(session);
System.out.println("SpringWebSocketHandler.afterConnectionEstablished");
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
super.handleMessage(session, message);
System.out.println("SpringWebSocketHandler.handleMessage");
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
super.handleTextMessage(session, message);
System.out.println("SpringWebSocketHandler.handleTextMessage");
}
@Override
protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
super.handlePongMessage(session, message);
System.out.println("SpringWebSocketHandler.handlePongMessage");
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
super.handleTransportError(session, exception);
System.out.println("SpringWebSocketHandler.handleTransportError");
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
super.afterConnectionClosed(session, status);
System.out.println("SpringWebSocketHandler.afterConnectionClosed");
}
@Override
public boolean supportsPartialMessages() {
System.out.println("SpringWebSocketHandler.supportsPartialMessages");
return super.supportsPartialMessages();
}
}SpringWebSocketConfig
package cn.chendd.websocket.spring;
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;
import javax.annotation.Resource;
/**
* SpringWebSocketConfig
*
* @author chendd
* @date 2023/6/2 22:11
*/
@Configuration
@EnableWebSocket
public class SpringWebSocketConfig implements WebSocketConfigurer {
@Resource
private SpringWebSocketHandler springWebSocketHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(springWebSocketHandler , "/websocket/spring").setAllowedOrigins("*");
}
}運(yùn)行結(jié)果

3.其它說(shuō)明
(1)本次示例重點(diǎn)在于服務(wù)端Java代碼的示例,未編寫(xiě)前端示例,可在下方的項(xiàng)目源碼中參見(jiàn)前端的HTML集成,或者是使用本例中使用的在線WebSocket測(cè)試的頁(yè)面地址進(jìn)行在線驗(yàn)證,右鍵查看其源代碼也是原生的HTML5規(guī)范的相關(guān)代碼;
(2)提供了JDK的內(nèi)置版本和Spring的封裝版本,個(gè)人推薦使用Spring的封裝版,畢竟JDK的注解不夠清晰的描述出被注解的方法的方法具體參數(shù),而Spring封裝版本有對(duì)于消息類型進(jìn)行封裝;
(3)代碼比較簡(jiǎn)單,結(jié)合前文的參考鏈接中的全量代碼也包含在內(nèi),代碼包結(jié)構(gòu)如下:
參考文章鏈接:一個(gè)猜你所選的小程序隨寫(xiě)

到此這篇關(guān)于SpringBoot集成WebSocket的兩種方式的文章就介紹到這了,更多相關(guān)SpringBoot集成WebSocket內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot應(yīng)用程序啟動(dòng)監(jiān)聽(tīng)功能的常見(jiàn)方法
應(yīng)用啟動(dòng)監(jiān)聽(tīng)在?Spring?Boot?和其他框架中扮演著重要的角色,它們的主要作用是在應(yīng)用啟動(dòng)或關(guān)閉時(shí)觸發(fā)特定的操作或任務(wù),本文給大家介紹了SpringBoot應(yīng)用程序啟動(dòng)監(jiān)聽(tīng)功能的常見(jiàn)方法,需要的朋友可以參考下2024-05-05
四步教你完美解決IDEA運(yùn)行maven項(xiàng)目時(shí)報(bào)錯(cuò):java:?錯(cuò)誤:?不支持發(fā)行版本?5
這篇文章主要介紹了四步教你完美解決IDEA運(yùn)行maven項(xiàng)目時(shí)報(bào)錯(cuò):java:?錯(cuò)誤:?不支持發(fā)行版本?5的相關(guān)資料,文中通過(guò)圖文將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2025-09-09
使用BigDecimal去掉小數(shù)點(diǎn)后無(wú)用的0
這篇文章主要介紹了使用BigDecimal去掉小數(shù)點(diǎn)后無(wú)用的0操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java一個(gè)數(shù)據(jù)整理的方法代碼實(shí)例
這篇文章主要介紹了java一個(gè)數(shù)據(jù)整理的方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java?AQS?原理與?ReentrantLock?實(shí)現(xiàn)方法
AQS 的作用是解決同步器的實(shí)現(xiàn)問(wèn)題,它將復(fù)雜的同步器實(shí)現(xiàn)分解為簡(jiǎn)單的框架方法,開(kāi)發(fā)者只需要實(shí)現(xiàn)少量特定的方法就能快速構(gòu)建出可靠的同步器,這篇文章主要介紹Java AQS原理與ReentrantLock實(shí)現(xiàn),需要的朋友可以參考下2025-03-03
HandlerMapping之RequestMappingHandlerMapping作用詳解
這篇文章主要介紹了HandlerMapping之RequestMappingHandlerMapping作用詳解,HandlerMapping是用來(lái)尋找Handler的,并不與Handler的類型或者實(shí)現(xiàn)綁定,而是根據(jù)需要定義的,那么為什么要單獨(dú)給@RequestMapping實(shí)現(xiàn)一個(gè)HandlerMapping,需要的朋友可以參考下2023-10-10
SpringBoot靜態(tài)資源與首頁(yè)配置實(shí)現(xiàn)原理深入分析
最近在做SpringBoot項(xiàng)目的時(shí)候遇到了“白頁(yè)”問(wèn)題,通過(guò)查資料對(duì)SpringBoot訪問(wèn)靜態(tài)資源做了總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10

