說(shuō)實(shí)話,當(dāng)老大跟我說(shuō)試下wss的時(shí)候,我一臉懵逼??,wss是啥?接觸java還沒(méi)多久,雖然知道了structs,IFTTT,但 what is wss?老大說(shuō),你去網(wǎng)上了解一下,然后看怎么樣?(我們是想做web api,然后在微信小程序上試試)。沒(méi)辦法,只好老老實(shí)實(shí)地百度google,自己埋頭查資料,寫demo,測(cè)試。最后,總算也完成了任務(wù),寫了幾個(gè)api,在微信小程序上也好好地運(yùn)行起來(lái)。開工第二天,閑著也是閑著,就來(lái)總結(jié)一下我的wss開發(fā)。
我相信,當(dāng)你在百度輸入wss的時(shí)候,并不能預(yù)想地搜到一大堆博客呀,介紹呀,還會(huì)摻雜一些亂七八糟的。別急,雖然沒(méi)什么有用的,但是還是可以找到沾邊點(diǎn)的東西。這時(shí),你會(huì)發(fā)現(xiàn),與wss連接在一起的,websocket,以及ws。websocket是關(guān)鍵。當(dāng)你搜索websocket的時(shí)候,然后就會(huì)有許多的博客文章來(lái)介紹websocket是什么了,怎么來(lái)實(shí)現(xiàn)websocket編程了。
現(xiàn)在,來(lái)說(shuō)說(shuō)我的理解吧,websocket是一種通信協(xié)議,可以類比于http。wss與ws就相當(dāng)http于https。wss是加密的安全通信協(xié)議,需要證書。所以初學(xué)下,我們可以從ws出發(fā)。websocket通信就相當(dāng)于建立一個(gè)tcp連接的通道,連接建立成功之后,雙方就可以互相通信了,直到連接關(guān)閉。從而可以實(shí)現(xiàn)服務(wù)端主動(dòng)向客戶端發(fā)送消息。另外,websocket通信是通過(guò)異步回調(diào)的,open,close,onMessage(收到消息),onError(發(fā)生錯(cuò)誤)都可以定義回調(diào),通過(guò)endPoint的方式??蛻舳丝梢圆挥米枞?,不用輪詢。順帶說(shuō)一下,通信格式是你可以自定義的,只要客戶端和服務(wù)端統(tǒng)一即可。不過(guò)大部分為json格式。
說(shuō)完了通信,我們?cè)賮?lái)說(shuō)說(shuō)開發(fā)部署運(yùn)行。websocket可以通過(guò)部署到tomcat上運(yùn)行。建立一個(gè)動(dòng)態(tài)的web工程,導(dǎo)出war包,部署到tomcat中即可.(同structs2,不清楚的可以看我上一篇<菜鳥創(chuàng)建一個(gè)簡(jiǎn)單的structs2項(xiàng)目>) 。
好了下面介紹下websocket編程吧。要進(jìn)行websoket編程,需要了解:
@ServerEndpoint ?
指定URI,相當(dāng)于http中的URL,寫在類前面
@OnOpen
websocket連接建立成功
@OnMessage
websocket收到消息
@OnClose
websocket連接關(guān)閉
@OnError
websocket發(fā)生異常錯(cuò)誤
好了,先看服務(wù)端。
首先創(chuàng)建類 RGBLightSocket(這是一個(gè)燈泡的socket類)。
在類的上面指定endPoint

指定打開方法:

指定接收到消息的方法:

指定關(guān)閉方法:

指定錯(cuò)誤方法:

好了,websoket的5個(gè)重要的方法都有了,發(fā)送消息使用sendText().
session.getBasicRemote().sendText(errMsg);
看一下我的發(fā)送方法:

服務(wù)端描述至此,再來(lái)看看客戶端如何與服務(wù)端通信吧。
以下為jsp頁(yè)面中的調(diào)用:
打開socket

發(fā)送消息:<開燈>

由上述可以看出,客戶端和服務(wù)端只需要在連接建立之后,發(fā)送消息和處理發(fā)送消息的回調(diào)即可。無(wú)需等待,沒(méi)有阻塞。