spring WebSocket示例詳解
場(chǎng)景
websocket是Html5新增加特性之一,目的是瀏覽器與服務(wù)端建立全雙工的通信方式,解決http請(qǐng)求-響應(yīng)帶來(lái)過(guò)多的資源消耗,同時(shí)對(duì)特殊場(chǎng)景應(yīng)用提供了全新的實(shí)現(xiàn)方式,比如聊天、股票交易、游戲等對(duì)對(duì)實(shí)時(shí)性要求較高的行業(yè)領(lǐng)域。
背景
在瀏覽器中通過(guò)http僅能實(shí)現(xiàn)單向的通信,comet可以一定程度上模擬雙向通信,但效率較低,并需要服務(wù)器有較好的支持; flash中的socket和xmlsocket可以實(shí)現(xiàn)真正的雙向通信,通過(guò) flex ajax bridge,可以在javascript中使用這兩項(xiàng)功能. 可以預(yù)見(jiàn),如果websocket一旦在瀏覽器中得到實(shí)現(xiàn),將會(huì)替代上面兩項(xiàng)技術(shù),得到廣泛的使用.面對(duì)這種狀況,HTML5定義了WebSocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實(shí)時(shí)通訊。目前各大主流瀏覽器都支持websocket,IE瀏覽器要IE10+
一、POM依賴
POM依賴,spring4.1.4.RELEASE,spring核心依賴請(qǐng)自行添加,下面是websocket相關(guān)jar
<dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>4.1.4.RELEASE</version> </dependency>
二、WebSocket入口
@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
//允許連接的域,只能以http或https開(kāi)頭
String[] allowsOrigins = {"http://www.xxx.com"};
//WebIM WebSocket通道
registry.addHandler(chatWebSocketHandler(),"/ webSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor());
registry.addHandler(chatWebSocketHandler(), "/sockjs/w ebSocketIMServer").setAllowedOrigins(allowsOrigins).addInterceptors(myInterceptor()).withSockJS();
}
@Bean
public ChatWebSocketHandler chatWebSocketHandler() {
return new ChatWebSocketHandler();
}
@Bean
public WebSocketHandshakeInterceptor myInterceptor(){
return new WebSocketHandshakeInterceptor();
}
}
1.實(shí)現(xiàn)WebSocketConfigurer接口,重寫(xiě)registerWebSocketHandlers方法,這是一個(gè)核心實(shí)現(xiàn)方法,配置websocket入口,允許訪問(wèn)的域、注冊(cè)Handler、SockJs支持和攔截器。
2.registry.addHandler注冊(cè)和路由的功能,當(dāng)客戶端發(fā)起websocket連接,把/path交給對(duì)應(yīng)的handler處理,而不實(shí)現(xiàn)具體的業(yè)務(wù)邏輯,可以理解為收集和任務(wù)分發(fā)中心。
3.setAllowedOrigins(String[] domains),允許指定的域名或IP(含端口號(hào))建立長(zhǎng)連接,如果只允許自家域名訪問(wèn),這里輕松設(shè)置。如果不限時(shí)使用"*"號(hào),如果指定了域名,則必須要以http或https開(kāi)頭。
4.addInterceptors,顧名思義就是為handler添加攔截器,可以在調(diào)用handler前后加入我們自己的邏輯代碼。
5.spring websocket也支持STOMP協(xié)議,下回再分享。
三、攔截器實(shí)現(xiàn)
public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object
> attributes) throws Exception {
if (request instanceof ServletServerHttpRequest) {
attributes.put("username",userName);
}
return true;
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
}
}
beforeHandshake,在調(diào)用handler前處理方法。常用在注冊(cè)用戶信息,綁定WebSocketSession,在handler里根據(jù)用戶信息獲取WebSocketSession發(fā)送消息。
四、Handler處理類
public class ChatWebSocketHandler extends TextWebSocketHandler{
private final static List<WebSocketSession> sessions = Collections.synchronizedList(new ArrayList<WebSocketSession>());
//接收文本消息,并發(fā)送出去
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
chatTextMessageHandler(message.getPayload());
super.handleTextMessage(session, message);
}
//連接建立后處理
@SuppressWarnings("unchecked")
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
logger.debug("connect to the websocket chat success......");
sessions.add(session);
//處理離線消息
}
//拋出異常時(shí)處理
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
if(session.isOpen()){
session.close();
}
logger.debug("websocket chat connection closed......");
sessions.remove(session);
}
//連接關(guān)閉后處理
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
logger.debug("websocket chat connection closed......");
sessions.remove(session);
}
@Override
public boolean supportsPartialMessages() {
return false;
}
}
五、客戶端連接
var host = window.location.host;
var websocket;
if ('WebSocket' in window) {
websocket = new ReconnectingWebSocket("ws://"
+ host + "/webSocketIMServer", null, {debug:true, maxReconnectAttempts:4});
} else if ('MozWebSocket' in window) {
websocket = new MozWebSocket("ws://" + host
+ "/webSocketIMServer");
} else {
websocket = new SockJS("http://" + host
+ "/sockjs/webSocketIMServer");
}
websocket.onopen = function(evnt) {
console.log("websocket連接上");
};
websocket.onmessage = function(evnt) {
messageHandler(evnt.data);
};
websocket.onerror = function(evnt) {
console.log("websocket錯(cuò)誤");
};
websocket.onclose = function(evnt) {
console.log("websocket關(guān)閉");
}
這里用到了ReconnectingWebSocket.js,對(duì)瀏覽器自帶websocket添加了擴(kuò)展,例如重連,連接超時(shí)時(shí)間,失敗重連間隔,嘗試連接最大次數(shù)等。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解spring boot Websocket使用筆記
- SpringBoot webSocket實(shí)現(xiàn)發(fā)送廣播、點(diǎn)對(duì)點(diǎn)消息和Android接收
- 完美解決spring websocket自動(dòng)斷開(kāi)連接再創(chuàng)建引發(fā)的問(wèn)題
- 詳解java WebSocket的實(shí)現(xiàn)以及Spring WebSocket
- 詳解WebSocket+spring示例demo(已使用sockJs庫(kù))
- java WebSocket的實(shí)現(xiàn)以及Spring WebSocket示例代碼
- Spring整合websocket整合應(yīng)用示例(下)
- Spring整合WebSocket應(yīng)用示例(上)
- Spring和Websocket相結(jié)合實(shí)現(xiàn)消息的推送
- spring框架下websocket的搭建
相關(guān)文章
Java實(shí)現(xiàn)的properties文件動(dòng)態(tài)修改并自動(dòng)保存工具類
這篇文章主要介紹了Java實(shí)現(xiàn)的properties文件動(dòng)態(tài)修改并自動(dòng)保存工具類,可實(shí)現(xiàn)針對(duì)properties配置文件的相關(guān)修改與保存功能,需要的朋友可以參考下2017-11-11
Java中的UrlDecoder 和 UrlEncoder_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
HTML 格式編碼的實(shí)用工具類。該類包含了將 String 轉(zhuǎn)換為 application/x-www-form-urlencoded MIME 格式的靜態(tài)方法。下文通過(guò)實(shí)例代碼給大家介紹Java中的UrlDecoder 和 UrlEncoder知識(shí),感興趣的的朋友一起看看吧2017-07-07
Java基于直方圖應(yīng)用的相似圖片識(shí)別實(shí)例
這篇文章主要介紹了Java基于直方圖應(yīng)用的相似圖片識(shí)別實(shí)例,是非常實(shí)用的技巧,多見(jiàn)于圖形里游戲中,需要的朋友可以參考下2014-09-09
spring AOP的After增強(qiáng)實(shí)現(xiàn)方法實(shí)例分析
這篇文章主要介紹了spring AOP的After增強(qiáng)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了spring面向切面AOP的After增強(qiáng)實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2020-01-01
spring Security的自定義用戶認(rèn)證過(guò)程詳解
這篇文章主要介紹了spring Security的自定義用戶認(rèn)證過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
親手教你IDEA2020.3創(chuàng)建Javaweb項(xiàng)目的步驟詳解
這篇文章主要介紹了IDEA2020.3創(chuàng)建Javaweb項(xiàng)目的步驟詳解,本文是小編手把手教你,通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-03-03

