基於 SockJS 的 WebSocket
在學習 《Spring實戰》 第18章的時候才知道,原來在不支持WebSocket的情況下,也可以很簡單地實現WebSocket的功能的,方法就是使用 SockJS。它會優先選擇WebSocket進行連接,但是當服務器或客戶端不支持WebSocket時,會自動在 XHR流、XDR流、iFrame事件源、iFrame HTML文件、XHR輪詢、XDR輪詢、iFrame XHR輪詢、JSONP輪詢 這幾個方案中擇優進行連接。
幸運的是,我們不需要知道這些方案都代表什么,只需要簡單地設置就可以使用了。
服務端
在啟動WebSocket的配置中,你需要做的所有事情就是加上 withSockJS()
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
// withSockJS 聲明啟用支持 sockJS
webSocketHandlerRegistry.addHandler(marcoHandler(), "/echo").withSockJS();
}
客戶端
在客戶端需要引入SockJS庫,然后把 new WebSocket(url); 替換成 new SockJS(url);
SockJS類和WebSocket類是兼容的,所以可以直接替換
<script type="text/javascript" src="/resources/js/sockjs-1.0.0.min.js"></script>
var sock = new SockJS(url);
需要做的事情就是這么多
效果展示
支持WebSocket
當瀏覽器和服務器都支持 websocket 的時候,直接使用websocket連接
不支持WebSocket
不支持WebSocket的場景有:
瀏覽器不支持
Web容器不支持,如tomcat7以前的版本不支持WebSocket
防火牆不允許
Nginx沒有開啟WebSocket支持
當遇到不支持WebSocket的情況時,SockJS會嘗試使用其他的方案來連接,剛開始打開的時候因為需要嘗試各種方案,所以會阻塞一會兒,之后可以看到連接有異常,那就是嘗試失敗的情況。
為了測試,我使用Nginx做反向代理,把www.test.com指到項目啟動的端口上,然后本地配HOST來達到模擬真實場景的效果。因為Nginx默認是不支持WebSocket的,所以這里模擬出了服務器不支持WebSocket的場景。
完整實例
完整的實例已經上傳到GitHub上,你可以查看。如果對你有幫助,記得 Star 哦!
https://github.com/dadiyang/springws
————————————————
版權聲明:本文為CSDN博主「dadiyang」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/dadiyang/article/details/83715569