這篇文章主要介紹“如何創(chuàng)建WebSocket服務(wù)端”,在日常操作中,相信很多人在如何創(chuàng)建WebSocket服務(wù)端問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何創(chuàng)建WebSocket服務(wù)端”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新新互聯(lián),憑借10多年的網(wǎng)站設(shè)計制作、成都網(wǎng)站制作經(jīng)驗,本著真心·誠心服務(wù)的企業(yè)理念服務(wù)于成都中小企業(yè)設(shè)計網(wǎng)站有1000+案例。做網(wǎng)站建設(shè),選創(chuàng)新互聯(lián)公司。
開始之前,我們先來看看我們今天要實現(xiàn)的效果:
好了,廢話不多說,我們進來看看這個東西要怎么樣實現(xiàn)吧!
這里和上文(WebSocket刨根問底(二))一樣,web項目創(chuàng)建成功之后,還是要我們先手動添加websocket的jar包進來。
頁面的效果效果小伙伴們剛才都看到了,我這里就直接上代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>ws頁面</title> <script src="jquery-3.2.1.js"></script> </head> <body> <input type="text" placeholder="請輸入您的昵稱" id="nickname"><input type="button" value="連接" id="btnClick1"> </div> <div id="resultDiv"></div> <div><input type="text" id="msg"><input type="button" value="發(fā)送" id="btnClick2" disabled="disabled"></div> <script> var webSocket; $("#btnClick2").click(function () { var msg = $("#msg").val(); $("#msg").val(''); webSocket.send(msg) }); $("#btnClick1").click(function () { var nickname = $("#nickname").val(); if(nickname==null||nickname=='') { alert("必須輸入昵稱"); return; } $("#btnClick2").removeAttr("disabled"); $(this).attr("disabled", "disabled"); $("#resultDiv").append("<p>開始連接服務(wù)端!</p>"); webSocket = new WebSocket("ws://localhost/myws2/"+nickname); webSocket.onerror = function (event) { $("#resultDiv").append("<p>onerror:" + event.data + "</p>"); } webSocket.onopen = function (event) { $("#resultDiv").append("<p>連接成功!</p>"); } webSocket.onmessage = function (event) { $("#resultDiv").append("<p>" + event.data + "</p>"); } }); </script> </body> </html>
關(guān)于這段HTML代碼,我說如下幾點:
1.一開始發(fā)送按鈕處于不可用狀態(tài),必須先連接
2.連接時必須先輸入昵稱,如果不輸入昵稱則彈出提示
3.連接成功之后連接按鈕處于不可點擊狀態(tài)而發(fā)送按鈕處于可點擊狀態(tài)
4.在連接按鈕的點擊事件中初始化WebSocket對象以及WebSocket中涉及到的一些方法的初始化
5.所有的信息(連接成功,連接出錯以及接收到消息)最后都顯示在resultDiv中
6.連接地址是動態(tài)變化的,最后的字符是連接的用戶名
由于我們這里要做的是群聊,所以服務(wù)端的主要功能就是接收客戶端傳來的消息并將之廣播給所有的客戶端。服務(wù)端代碼如下:
@ServerEndpoint("/myws2/{nickname}") public class WebSocketServer2 { private String nickname; private Session session; private static final Set<WebSocketServer2> WEB_SOCKET_SERVER_2_SET = new CopyOnWriteArraySet<WebSocketServer2>(); @OnMessage public void onMessage(String message, @PathParam(value = "nickname") String nickname) throws IOException { System.out.println("收到了客戶端發(fā)來的消息:" + message); sendText(nickname+"發(fā)來了:"+message); } private static void sendText(String msg) { for (WebSocketServer2 webSocketServer2 : WEB_SOCKET_SERVER_2_SET) { try { synchronized (webSocketServer2) { webSocketServer2.session.getBasicRemote().sendText(msg); } } catch (IOException e) { WEB_SOCKET_SERVER_2_SET.remove(webSocketServer2); try { webSocketServer2.session.close(); } catch (IOException e1) { } sendText(webSocketServer2.nickname + "同學(xué)已經(jīng)下線"); } } } @OnOpen public void onOpen(Session session, @PathParam(value = "nickname") String nickname) throws IOException { this.nickname = nickname; this.session = session; WEB_SOCKET_SERVER_2_SET.add(this); sendText(nickname + "進入房間"); StringBuffer sb = new StringBuffer(); for (WebSocketServer2 webSocketServer2 : WEB_SOCKET_SERVER_2_SET) { sb.append(webSocketServer2.nickname).append(";"); } sendText("當(dāng)前房間有:"+sb.toString()); } @OnClose public void onClose(Session session) throws IOException { WEB_SOCKET_SERVER_2_SET.remove(this); sendText(this.nickname+"童鞋已下線"); } }
關(guān)于這個服務(wù)端我解釋如下幾點:
1.第一行的代碼表示服務(wù)端的名字,但是名字里邊有一個{nickname},表示獲取服務(wù)端傳遞來的最后一個參數(shù),在方法里邊可以通過@PathParam來獲取,這個和SpringMVC的參數(shù)注解如出一轍
2.第三行和第四行創(chuàng)建了兩個對象,因為當(dāng)客戶端臉上服務(wù)端之后,一個客戶端將對應(yīng)一個WebSocketServer2對象,我需要將每一個客戶端的有關(guān)信息保存下來,因此創(chuàng)建出nickname表示該對象對應(yīng)的客戶端的用戶昵稱,session表示該對象對應(yīng)的客戶端的session
3.第五行創(chuàng)建一個Set集合,該集合是static final類型的,表示不管WebSocketServer2的對象有多少個,WEB_SOCKET_SERVER_2_SET集合始終是同一個,該集合主要用來保存所有連接的客戶端對應(yīng)的WebSocketServer2對象
4.第30行到41行是open方法的邏輯,該方法有兩個參數(shù),第一個session,第二個nickname,nickname參數(shù)有一個注解@PathParam表示該參數(shù)的值就是連接地址里邊的最后一個字符串,這個參數(shù)是可選的。在該方法里,首先將nickname和session賦值給對應(yīng)的全局變量,然后將當(dāng)前對象添加到set集合中,然后調(diào)用sendText方法發(fā)送一條消息,告訴所有的客戶端XXX進入房間啦,最后遍歷set集合中的所有用戶,拿到所有用戶的用戶名,再告訴所有客戶端當(dāng)前的房間都有誰誰誰。
5.第13-28行的sendText方法是一個自定義的靜態(tài)方法,該方法主要用來向所有的客戶端廣播消息,該方法的基本邏輯就是遍歷set集合,拿到set集合中的每一個對象和每一個對象中的session,再利用session向?qū)?yīng)的客戶端發(fā)送消息,如果消息發(fā)送失敗,則將該用戶從集合中移除,同時告訴剩余的客戶端某某人已經(jīng)下線。
6.第7-10行的代碼主要用來處理客戶端發(fā)送來的消息,默認的String類型的參數(shù)表示客戶端發(fā)送來的消息,其他的String類型參數(shù)都要加上注解才可以,我們這里第一個參數(shù)表示客戶端發(fā)送來的消息,第二個參數(shù)表示發(fā)送客戶端消息的用戶昵稱,這里收到消息之后,再利用sendText廣播給所有用戶。
7.第43行到47行表示當(dāng)其中一個用戶下線了了會回調(diào)的close方法,在這里方法里首先從集合中移除該客戶端對應(yīng)的WebSocketServer2對象,然后廣播一條消息將該用戶下線的事告訴所有人。
到此,關(guān)于“如何創(chuàng)建WebSocket服務(wù)端”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
本文名稱:如何創(chuàng)建WebSocket服務(wù)端
標(biāo)題鏈接:http://jinyejixie.com/article36/jjpgpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、網(wǎng)站維護、手機網(wǎng)站建設(shè)、網(wǎng)站制作、微信公眾號、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)