欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何創(chuàng)建WebSocket服務(wù)端

這篇文章主要介紹“如何創(chuàng)建WebSocket服務(wù)端”,在日常操作中,相信很多人在如何創(chuàng)建WebSocket服務(wù)端問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何創(chuàng)建WebSocket服務(wù)端”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新新互聯(lián),憑借10多年的網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作經(jīng)驗(yàn),本著真心·誠(chéng)心服務(wù)的企業(yè)理念服務(wù)于成都中小企業(yè)設(shè)計(jì)網(wǎng)站有1000+案例。做網(wǎng)站建設(shè),選創(chuàng)新互聯(lián)公司。

開(kāi)始之前,我們先來(lái)看看我們今天要實(shí)現(xiàn)的效果:

如何創(chuàng)建WebSocket服務(wù)端  

好了,廢話不多說(shuō),我們進(jìn)來(lái)看看這個(gè)東西要怎么樣實(shí)現(xiàn)吧!

創(chuàng)建Web項(xiàng)目

這里和上文(WebSocket刨根問(wèn)底(二))一樣,web項(xiàng)目創(chuàng)建成功之后,還是要我們先手動(dòng)添加websocket的jar包進(jìn)來(lái)。

創(chuàng)建HTML頁(yè)面

頁(yè)面的效果效果小伙伴們剛才都看到了,我這里就直接上代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ws頁(yè)面</title>
    <script src="jquery-3.2.1.js"></script>
</head>
<body>
<input type="text" placeholder="請(qǐng)輸入您的昵稱" 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>開(kāi)始連接服務(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代碼,我說(shuō)如下幾點(diǎn):

1.一開(kāi)始發(fā)送按鈕處于不可用狀態(tài),必須先連接
2.連接時(shí)必須先輸入昵稱,如果不輸入昵稱則彈出提示
3.連接成功之后連接按鈕處于不可點(diǎn)擊狀態(tài)而發(fā)送按鈕處于可點(diǎn)擊狀態(tài)
4.在連接按鈕的點(diǎn)擊事件中初始化WebSocket對(duì)象以及WebSocket中涉及到的一些方法的初始化
5.所有的信息(連接成功,連接出錯(cuò)以及接收到消息)最后都顯示在resultDiv中
6.連接地址是動(dòng)態(tài)變化的,最后的字符是連接的用戶名

創(chuàng)建WebSocket服務(wù)端

由于我們這里要做的是群聊,所以服務(wù)端的主要功能就是接收客戶端傳來(lái)的消息并將之廣播給所有的客戶端。服務(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ā)來(lái)的消息:" + message);
        sendText(nickname+"發(fā)來(lái)了:"+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 + "進(jìn)入房間");
        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)于這個(gè)服務(wù)端我解釋如下幾點(diǎn):

1.第一行的代碼表示服務(wù)端的名字,但是名字里邊有一個(gè){nickname},表示獲取服務(wù)端傳遞來(lái)的最后一個(gè)參數(shù),在方法里邊可以通過(guò)@PathParam來(lái)獲取,這個(gè)和SpringMVC的參數(shù)注解如出一轍
2.第三行和第四行創(chuàng)建了兩個(gè)對(duì)象,因?yàn)楫?dāng)客戶端臉上服務(wù)端之后,一個(gè)客戶端將對(duì)應(yīng)一個(gè)WebSocketServer2對(duì)象,我需要將每一個(gè)客戶端的有關(guān)信息保存下來(lái),因此創(chuàng)建出nickname表示該對(duì)象對(duì)應(yīng)的客戶端的用戶昵稱,session表示該對(duì)象對(duì)應(yīng)的客戶端的session
3.第五行創(chuàng)建一個(gè)Set集合,該集合是static final類型的,表示不管WebSocketServer2的對(duì)象有多少個(gè),WEB_SOCKET_SERVER_2_SET集合始終是同一個(gè),該集合主要用來(lái)保存所有連接的客戶端對(duì)應(yīng)的WebSocketServer2對(duì)象
4.第30行到41行是open方法的邏輯,該方法有兩個(gè)參數(shù),第一個(gè)session,第二個(gè)nickname,nickname參數(shù)有一個(gè)注解@PathParam表示該參數(shù)的值就是連接地址里邊的最后一個(gè)字符串,這個(gè)參數(shù)是可選的。在該方法里,首先將nickname和session賦值給對(duì)應(yīng)的全局變量,然后將當(dāng)前對(duì)象添加到set集合中,然后調(diào)用sendText方法發(fā)送一條消息,告訴所有的客戶端XXX進(jìn)入房間啦,最后遍歷set集合中的所有用戶,拿到所有用戶的用戶名,再告訴所有客戶端當(dāng)前的房間都有誰(shuí)誰(shuí)誰(shuí)。
5.第13-28行的sendText方法是一個(gè)自定義的靜態(tài)方法,該方法主要用來(lái)向所有的客戶端廣播消息,該方法的基本邏輯就是遍歷set集合,拿到set集合中的每一個(gè)對(duì)象和每一個(gè)對(duì)象中的session,再利用session向?qū)?yīng)的客戶端發(fā)送消息,如果消息發(fā)送失敗,則將該用戶從集合中移除,同時(shí)告訴剩余的客戶端某某人已經(jīng)下線。
6.第7-10行的代碼主要用來(lái)處理客戶端發(fā)送來(lái)的消息,默認(rèn)的String類型的參數(shù)表示客戶端發(fā)送來(lái)的消息,其他的String類型參數(shù)都要加上注解才可以,我們這里第一個(gè)參數(shù)表示客戶端發(fā)送來(lái)的消息,第二個(gè)參數(shù)表示發(fā)送客戶端消息的用戶昵稱,這里收到消息之后,再利用sendText廣播給所有用戶。
7.第43行到47行表示當(dāng)其中一個(gè)用戶下線了了會(huì)回調(diào)的close方法,在這里方法里首先從集合中移除該客戶端對(duì)應(yīng)的WebSocketServer2對(duì)象,然后廣播一條消息將該用戶下線的事告訴所有人。

到此,關(guān)于“如何創(chuàng)建WebSocket服務(wù)端”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

本文名稱:如何創(chuàng)建WebSocket服務(wù)端
標(biāo)題鏈接:http://aaarwkj.com/article36/jjpgpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站維護(hù)、手機(jī)網(wǎng)站建設(shè)網(wǎng)站制作、微信公眾號(hào)、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司
中文字幕丰满人妻不满中出片 | 亚洲av成人精品日韩一区麻豆 | 亚洲永久免费黄色av| 中文字幕成人资源网站| 日韩国产推荐一区二区| 欧美亚洲精品二区久久久| 青青草成人公开在线视频| 国产精品av一区二区在线| 亚洲家庭伦理在线观看| 中文字幕人妻日韩在线| 欧美黄片不用下载在线观看| 在线免费观看国产黄色av| av成人资源一区久久| 中文字幕久久av一区二区| 国产精品一区二区三区播放| 久久一区二区视频在线观看| 亚洲男人天堂超碰在线| 国产精品久久一级黄片| 欧美大吊视频在线观看| 四虎精品在线免费视频| 麻豆国产免费av在线| 久久精品亚洲熟女av蜜謦| 国产一区二区精品久久久女同| av熟女一区二区三区| 九九久久九九精美视频| 热久久视频这里只有精品| 青青草网站在线观看视频| 亚洲无线码一区国产欧美国日| 你懂的免费视频中文字幕| 理论三级麻豆国产在线| 国产黄色一区二区三区| 一区二区三区欧美小黄片| av在线日韩国产精品| 在线看黄视频网站永久免费| 欧美一区二区三区蜜桃| 欧美成人午夜福利在线视频| 欧美日韩一区二区三区四区高清视频| 青草成人在线视频观看| 国产三级三级三级三级| 国产麻豆剧传媒国产av| 美女诱惑丝袜国产国产av丝袜|