wss 初體驗(yàn)

說(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

value即URI,帶{}為參數(shù)。configurator 為配置器,即請(qǐng)求過(guò)來(lái)的時(shí)候,會(huì)先進(jìn)入配置器,你可以在這里做一些權(quán)限校驗(yàn),是否允許這個(gè)連接建立,如果無(wú)需校驗(yàn)或其它一些前處理,可以不指定,即使用系統(tǒng)默認(rèn)的

指定打開方法:

在打開方法中判定配置器的校驗(yàn)參數(shù),如果校驗(yàn)失敗,則關(guān)閉session,則連接不會(huì)建立。并維護(hù)session列表。

指定接收到消息的方法:


message 為收到的消息,@PathParam(value="access_token")String token 為URI中參數(shù)的一種寫法。你可以寫你需要用的參數(shù),不需要的可以不寫。在這里解析和處理消息。處理完成之后,發(fā)送消息給客戶端。我這在parseMessage() 方法里。你可以根據(jù)需求是只發(fā)送給當(dāng)前會(huì)話的session,還是要發(fā)給多個(gè)用戶。所以需要在open的時(shí)候維護(hù)session。


指定關(guān)閉方法

關(guān)閉的時(shí)候釋放一些資源

指定錯(cuò)誤方法:

當(dāng)socket錯(cuò)誤的時(shí)候的處理


好了,websoket的5個(gè)重要的方法都有了,發(fā)送消息使用sendText().

session.getBasicRemote().sendText(errMsg);

看一下我的發(fā)送方法:


我這是發(fā)送給所有擁有mac地址這個(gè)設(shè)備的用戶。用戶只需在開始查詢一次這個(gè)設(shè)備的狀態(tài),之后每次對(duì)這個(gè)設(shè)備的操作,不論是來(lái)源于哪個(gè)用戶,我都向所有正在連接的擁有這個(gè)設(shè)備的用戶發(fā)送操作完成之后的狀態(tài)。從而解決了輪詢問(wèn)題。當(dāng)然,這個(gè)需要你的endPoint設(shè)計(jì)合理。


服務(wù)端描述至此,再來(lái)看看客戶端如何與服務(wù)端通信吧。

以下為jsp頁(yè)面中的調(diào)用:

打開socket

wss和ws都可用。只是wss需要開放443端口。需要在server.xml和web.xml中配置。同https的配置。

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


使用socket調(diào)用send() 方法發(fā)送定義好的格式字符串即可


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容