websocket

websocket能幹啥?讓客戶端與服務器保持長連接,在連接過程中雙方可相互通訊。就有如視圖serversocket建立tcp通訊一樣。websocket讓雙方保持長連接的相互通訊。平常是,請求服務器,服務器響應數據。現在可以雙方進行長連接通訊了

 

引入websocket的實現,javax.websocket.api:獲得引入其他jar,比如Tomcat-websocket通過其他jar對javax.websocket.api依賴,來引入websocket依賴。總之將依賴jar放進來

 

前端JS部分:

<script>
    var websocket;
    if ('WebSocket' in window) {
        websocket = new WebSocket("ws://localhost:8080/webSocketServer/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>

判斷window對象是否支持websocket,判斷瀏覽是否支持。

如果之處,使用websocket的url對服務器發起請求,ws://ip:port/uri/paramter。協議以ws開頭,服務器的地址,服務器的接收者,帶給服務器的參數。使用這個url去連接服務器。

 

onOpen,當與服務器建立連接時觸發

onError,當發生異常時觸發

onMessage ,當收到服務器的消息時觸發

onbeforeunload ,瀏覽器要關閉前觸發

 

加載到script時,就去判斷支不支持websocket,支持就去實例化websocket對象,構造器傳websocket地址,此時就可以在構造對象時去連接websocket服務器了。然後給window註冊websocket的事件事件。

 

寫個輸入框與按鈕,註冊事件。點擊時觸發事件,websocket.send()給服務器發送信息。填寫內容,點擊按鈕,觸發事件。使用websocket的send發出消息。在之前就與服務器建立長連接,現在就可以進行發送了

 

websocket服務器:

這注解都在是javax包下的websocket包下。@ServerEndpoint給websocket定義服務器,當訪問這個uri就是請求這個服務了。後面是參數,參數只是一個標識,有需要就帶,沒需要就不需要,{name}使用{}包裹參數,當請求時,請求uri:websocketServer/後面就是參數了

 

這裏集合是存儲對象,session是當客戶端與服務器建立連接時,將產生這樣一個會話對象。這個對象就是服務器與客戶端的聯繫紐帶。name只是個表示,根據實際情況而定。這裏面封裝對象還是幹什麼,都根據實際情況

 

@OnOpen,當與客戶端打開建立連接時,觸發。寫上這個註解,建立連接就會調用這個方法。@PathParam這個是從路徑上分割出uri後面的參數。如果沒有這個註解,就是報錯。因爲這個參數他不知道給啥。所以使用註解表示這個是取後面的參數的,這個後面的參數指客戶端請求服務器時的url上的uri後面的參數,也就是之前的@ServerEndpoint後面的name從這個分割出來。後面是session是創建連接時自己創建的會話對象,會給我們塞入進來。

 

當客戶與服務器建立連接時,將走入到@OnOen小的方法,我們能獲得session對象。保存在對象上。@onMessage當客戶發送消息時,我們就收到消息,那麼就觸發執行這個方法,一個是message內容,一個是session,內容就是客戶端發送時send裏面的內容獲得。

 

session.getAsyncRemote從session會話中,取得這端。什麼意思呢?從session對象獲得到連接,獲得到對象的那一端連接,就像socket一樣獲得連接,獲得到流sendText發送信息。我們這裏就是,客戶與服務器建立連接,然後又取得客戶端的流,等於是客戶自己給自己發送,不過這個過程經過websocket中轉了一下。畢竟是個測試,通了就OK

 

@onClose當連接關閉時觸發,一般是客戶端斷開連接。@OnError發送異常時觸發。

 

剛加載頁面時,則就解析到script,支持websocket,根據URL連接服務器,後面的name在之前就定死了。ws://ip:port/websocketserver/zhangsan。已經張name寫死了。消息也是,發送的是xxhh,而不是定義內容,這樣簡單一點。所以發送的消息是xixihaha

 

服務器知道客戶端來連接,雙方建立連接,onOpen建立連接觸發,onMessage收到消息觸發。期間都有session會話對象。獲得到客戶端端也就是流,然後將消息又發了回去,客戶端收到了自己給服務器發的消息xixihaha

 

websocket就完成了,其註解都是在javax包下。爲什麼寫上註解就能執行到我註解下的方法?獲得到類,class構造類獲得類的所有方法又獲得所有註解。判斷方法上的註解,如果有匹配的註解,則調用這個方法。這就等於是,反射類獲得類的構造去調用,或是其他做法,僅是自己一時的想法。websocket就使用完畢

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