Springboot整合websocket

引入javax.websocket.api得到運用websocket,爲什麼要Springboot要整合websocket?在websocket運行於外部Tomcat時,當一對servlet訪問,就產生了一個websocket實例,兩兩相對通訊,一個客戶端一個服務端。經過這個發現,導致後面的代碼要改,比如容器不能在這裏面要麼是靜態!因爲這是產生多例

 

在運行於外部Tomcat,一個訪問一個實例服務,運行在Springboot內嵌Tomcat則不是這樣了,訪問不上,因爲註冊不進去。指的不上注入到Spring容器中,而是websocket服務註冊不進去通過以前的方法。實例對象註解能注入,到websocket服務註冊不到Tomcat容器中。就訪問不上了,所以有整合一說,使用Springboot按約定進行整合開發。因爲有依賴所以要整合,websocket依賴於web容器,而Springboot自己嵌容器,所以要進去就只有整合。如果無依賴Spring則注入與否都一樣

 

jsp代碼和之前的一樣,通過url長時間連接服務器,進行通訊。頁面代碼:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script>
        var websocket;
        if ('WebSocket' in window) {
            websocket = new WebSocket("ws://localhost:8080/websocket/zhangsan");
        } else {
            console.log("不支持websocket");
        }
        window.onbeforeunload = function (ev) {
            console.log("準備關閉連接")
            websocket.close();
        }
        websocket.onmessage = function (ev) {
            console.log("收到服務器消息: " + ev.data)
        }
        websocket.onerror = function (ev) {
            console.log("出現異常")
        }
        websocket.onopen = function (ev) {
            console.log("連接建立成功")
        }
    </script>
</head>
<body>
<input type="text" name="">
<button id="clickEndpoint">發送消息</button>
</body>

<script>
    var v = document.getElementById("clickEndpoint");
    v.onclick = function (msg) {
        websocket.send("xixihaha");
    }
</script>

</html>

判斷是否支持websocket,加載script時通過ws://url連接服務器,給window註冊時間,點擊按鈕websocket對象.send發出信息

 

 

服務端:

@Configuration表示自己是個配置類,@EnableWebSocket將websocket的bean都管理進來。實現與websocketConfigurer接口。將重寫方法registerWebSocketHandler是:註冊websocket處理者。前面是處理者類,後面是websocket的服務名。

 

給註冊處理類添加攔截器,這樣將在進行websocket經過攔截器,當然攔截器可要可不要。如果有需求到可要要,我們這裏爲了拿到一點信息使用了攔截器

 

攔截器:

實現攔截器接口,將重寫2方法,攔截前與攔截後方法,。從請求頭獲得url,得到/zhangsan,截取掉/,拿到參數的map,將截取的名字放進去,後面可要拿到這個map在websocket處理類中攔截器返回true表示繼續往下調用,否則將原地停止

 

實現處理類,裏面的方法與websocket類似,建立連接,存儲在容器中。接收到消息調用Message方法,並得到websocketsession對象發送消息。這裏是自己給自己發,也不打算去找誰去發送

 

發送異常以連接管理。都在重寫方法內

 

通訊成功

 

使用websocket連接是建立了,但用戶一刷新又是新連接這樣也不合適,於是給用戶打標識。關於如何調用到註解下的方法,工程收到別人的管理,他得到類的構造掃描類下的所有註解,符合就調用。如果他想在類的前與後做操作就產生代理。這兩點做法是不一樣的。一個是構造得到類的註解調用這些方法,一個是給類代理在類調用前後觸發inkove不知不覺進行前與後操作

 

關於攔截器與過濾器,過濾器是符合過濾要求進入過濾器,可以選擇往下調用,當掉完在回調到方法調用處。而攔截器是給類產生代理。在類的前後前後調用操作,調不調用你要掉的方法是隨便

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章