這篇文章將為大家詳細講解有關使用webSocket需要注意什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
從網(wǎng)站建設到定制行業(yè)解決方案,為提供成都網(wǎng)站建設、網(wǎng)站設計服務體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設解決方案,助力業(yè)務快速發(fā)展。創(chuàng)新互聯(lián)公司將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務。
一種網(wǎng)絡通信協(xié)議,是 HTML5
開始提供的一種在單個 TCP 連接上進行全雙工通訊的協(xié)議。
HTTP 協(xié)議的缺陷:通信只能由客戶端發(fā)起,且服務端不能主動向客戶端發(fā)送資源。
如果想要知道服務端是否準備好資源,只有采用輪詢方式請求,浪費資源(因為必須不停連接,或者 HTTP 連接始終打開), websocket正是解決了這一問題,可以實現(xiàn)雙向通信。
WebSocket目前支持兩種統(tǒng)一資源標志符ws
和wss
,類似于HTTP和HTTPS,主要是加密與非加密的兩種協(xié)議。
一圖看懂HTTP與webSocket的原理區(qū)別:
常用注解:
@ServerEndpoint(value = "/webSocketProxy/{nickName}")
表示一個URI映射的路徑,標準的restfulAPI,{nickName}為路徑參數(shù)。用于注解于類上。
@OnOpen @OnMessage @OnClose @OnError
以上四個注解用于方法上,分別對應不同的事件:打開連接、收到消息、連接關閉、發(fā)生錯誤。當發(fā)生對應事件時,該方法將會被觸發(fā)。通常開發(fā)中主要在@OnMessage方法內(nèi)進行業(yè)務開發(fā)。
@PathParam("nickName")
此注解用于獲取路徑參數(shù){nickName}。
五種連接狀態(tài):
NOT_YET_CONNECTED, CONNECTING, OPEN, CLOSING, CLOSED;
服務端的簡單實例
@ServerEndpoint(value = "/customWebSocket/{nickName}") @Component @Slf4j public class CustomWebSocket { // 用來存放每個客戶端對應的MyWebSocket對象 全局對象 private static CopyOnWriteArraySet<CustomWebSocket> user = new CopyOnWriteArraySet<CustomWebSocket>(); // 與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù) private Session session; @OnMessage public void onMessage(String message, Session session, @PathParam("nickName") String nickName) throws IOException { // 群發(fā)消息 for (CustomWebSocket myWebSocket : user) { log.info("請求url:" + session.getRequestURI()); myWebSocket.session.getBasicRemote().sendText(nickName + " :" + message); log.info("custom 收到消息:" + nickName + " :" + message); } } @OnOpen public void onOpen(Session session) { log.info("custom " + session.getId() + " open..."); this.session = session; user.add(this); } @OnClose public void onClose() { System.out.println("custom " + this.session.getId() + " close..."); session=null; user.remove(this); } @OnError public void onError(Session session, Throwable error) { session=null; log.warn("custom " + this.session.getId() + " error...",error); }
WebSocket服務端 由spring管理后,默認是單例,但是對于WebSocket對象,每個連接會新建一個對象, 因此需要注意static關鍵字的優(yōu)雅使用。一個session對應一個會話。
特別注意這段代碼,使用了static 修飾是類屬性,用來存儲所有連接的客戶端信息。 static CopyOnWriteArraySet<CustomWebSocket> user = new CopyOnWriteArraySet<CustomWebSocket>();
如果報錯:The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method,則是存在多線程并發(fā)發(fā)送消息的情況。采用同步機制即可。
synchronized (session){ session.getBasicRemote().sendText(JSON.toJSONString(message)); }
關于“使用webSocket需要注意什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
文章名稱:使用webSocket需要注意什么
URL網(wǎng)址:http://m.rwnh.cn/article18/jeppdp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、品牌網(wǎng)站設計、ChatGPT、App設計、做網(wǎng)站、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)