<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Think-Swoole之WebSocket消息、廣播以及 Swoole 原生方法調用

        來源:懂視網 責編:小采 時間:2020-11-02 18:02:00
        文檔

        Think-Swoole之WebSocket消息、廣播以及 Swoole 原生方法調用

        Think-Swoole之WebSocket消息、廣播以及 Swoole 原生方法調用:Think-Swoole 教程之WebSocket 消息、廣播以及 Swoole 原生方法調用什么是客戶端的 fdfd 是在 Swoole 中客戶端的唯一標識符,fd 是復用的,當連接關閉后 fd 會被新進入的連接復用,正在維持的 TCP 連接 fd 不會被復用。獲取當前客戶端的fdapp/li
        推薦度:
        導讀Think-Swoole之WebSocket消息、廣播以及 Swoole 原生方法調用:Think-Swoole 教程之WebSocket 消息、廣播以及 Swoole 原生方法調用什么是客戶端的 fdfd 是在 Swoole 中客戶端的唯一標識符,fd 是復用的,當連接關閉后 fd 會被新進入的連接復用,正在維持的 TCP 連接 fd 不會被復用。獲取當前客戶端的fdapp/li
        Think-Swoole 教程之WebSocket 消息、廣播以及 Swoole 原生方法調用

        什么是客戶端的 fd

        fd 是在 Swoole 中客戶端的唯一標識符,fd 是復用的,當連接關閉后 fd 會被新進入的連接復用,正在維持的 TCP 連接 fd 不會被復用。

        獲取當前客戶端的fd

        app/listener/WsConnect.php

        <?php
        declare (strict_types = 1);
        namespace applistener;
        use 	hinkswooleWebsocket;
        class WsTest
        {
         /**
         * 事件監聽處理
         *
         * @return mixed
         */
         public function handle($event,Websocket $ws)
        {
        // $ws = app('thinkswooleWebsocket'); // 單例
         //獲取當前發送消息客戶端的 fd
         var_dump($ws -> getSender());
         }
        }

        test.html

        <!DOCTYPE HTML>
        <html>
        <head>
         <meta charset="UTF-8">
         <title>Document</title>
        </head>
        <body>
        消息:<input type="text" id="message">
        接收者:<input type="text" id="to">
        <button onclick="send()">發送</button>
        <script>
         var ws = new WebSocket("ws://127.0.0.1:9501/");
         ws.onopen = function(){
         console.log('連接成功');
         }
         ws.onmessage = function(data){
         console.log(data.data);
         }
         ws.onclose = function(){
         console.log('連接斷開');
         }
         function send()
        {
         var message = document.getElementById('message').value;
         var to = document.getElementById('to').value;
         console.log("準備給" + to + "發送數據:" + message);
         ws.send(JSON.stringify(['test',{
         to:to,
         message:message
         }])); //發送的數據必須是 ['test',數據] 這種格式
         }
        </script>
        </body>
        </html>

        瀏覽器打開多個標簽,來模擬多個客戶端連接,均訪問 test.html 文件,控制臺將會打印出每個客戶端的 fd ,如下圖我們打開三個標簽進行訪問:

        547cdcfe630d9cd9328df012b72e9ff.png

        也就是說,服務端發送過來的消息,都會被 HTML 中的 ws.onmessage 接收到。

        給指定 fd 的客戶端發送消息(單發、群發)

        app/listener/WsTest.php

        <?php
        declare (strict_types = 1);
        namespace applistener;
        use 	hinkswooleWebsocket;
        class WsTest
        {
         /**
         * 事件監聽處理
         *
         * @return mixed
         */
         public function handle($event,Websocket $ws)
        {
        // $ws = app('thinkswooleWebsocket'); // 單例
         //獲取當前發送消息客戶端的 fd
         var_dump($ws -> getSender());
         //發送給指定 fd 的客戶端,包括發送者自己
         $ws -> to(intval($event['to'])) -> emit('testcallback',$event['message']);
         }
        }

        $ws -> to()是設置收件人 fd 或聊天室名,如果發送給多個人可以數組設置多個,例如 [1,2,3],fd 須為整型。$ws -> emit() 是發送消息方法,第一個參數是事件名稱,用于多場景,可任意定義,就如上一片文章中客戶端給服務端發送消息的 Test 一樣。第二個參數是發送的內容,可以是字符串、數組,單獨調用不設置收件人的話,就是發送消息給當前 fd 。

        重啟 Think-Swoole 服務,分別打開三個客戶端進行連接,fd 分別為 1、2、3,現在,現在,我們用 fd 為 1 的客戶端,發消息給 fd 為 2 的客戶端:

        82eec924788243f9272d0fbbc528aed.png

        發送后,可見只有 fd 為 1、2 的客戶端能收到消息(也就是說消息發出者自身也會收到消息),而 fd 為 3 的客戶端卻沒有收到消息:

        65fa9245ede5380ad675f5b8cf3b371.png

        發送后,可見只有 fd 為 1、2 的客戶端能收到消息(也就是說消息發出者自身也會收到消息),而 fd 為 3 的客戶端卻沒有收到消息:

        ca5a7a20d3ee5587d070f1bf6febe73.png

        發送廣播消息

        廣播消息就是發送一條消息給所有客戶端,但是不包括自己。

        app/listener/WsConnect.php

        <?php
        declare (strict_types = 1);
        namespace applistener;
        use 	hinkswooleWebsocket;
        class WsTest
        {
         /**
         * 事件監聽處理
         *
         * @return mixed
         */
         public function handle($event,Websocket $ws)
        {
         //獲取當前發送消息客戶端的 fd
         var_dump($ws -> getSender());
         //發送廣播消息
         $ws -> broadcast() -> emit('testcallback',$event['message']);
         }
        }

        $ws -> broadcast() 方法就是發送廣播消息。

        但是如果想自己也收到廣播消息,那就需要增加一條 $ws -> to($ws -> getSender()) -> emit('testcallback',$event['message']); 即可。

        模擬客戶端給另一個客戶端發消息

        假設我當前 fd 為 1,但是我要模擬 用 fd 為 2 的客戶端給 fd 為 3 的客戶端發送消息,只需設置發送者 fd 和接收者兩個 fd 即可:

        $ws -> setSender(2) -> to(3) -> emit('testcallback',$event['message']);

        經測試,1 沒有收到消息,2 和 3 都收到了。

        獲取 SwooleWebSocketServer

        假設說我們現在需要一個功能,判斷一個客戶端是否為有效客戶端,即是否與服務端握手成功。Think-Swoole 擴展中沒有這個功能,但是查閱 Swoole 官方文檔,有個 isEstablished 函數可以完成我們需要的功能,那么怎樣通過 Think-Swoole 拿到原生 Swoole 函數呢,答案就是獲取 SwooleWebSocketServer 這個類。有兩種方式:

        1、app('swoole.server');

        2、app('thinkswooleManager') -> getServer();

        實例化后,就可以調用 Swoole 原生方法了,如:

        $manager = app('thinkswooleManager');
        $manager -> getServer() -> isEstablished(2);

        附: hinkSwooleWebsocket類對象方法:

      1. broadcast 設置進行廣播消息發送

      2. isBroadcast 判斷當前是否是廣播模式

      3. to 設置收件人 fd 或聊天室名(可以數組設置多個)

      4. getTo 獲取收件人 fd 或聊天室名

      5. join 當前客戶端加入到指定聊天室(可以多個)

      6. leave 當前客戶端離開指定聊天室(可以多個)

      7. emit 消息發送

      8. close 關閉當前連接

      9. getSender 獲取當前客戶端 id(即fd)

      10. setSender 設置發件人的 fd

      11. 聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Think-Swoole之WebSocket消息、廣播以及 Swoole 原生方法調用

        Think-Swoole之WebSocket消息、廣播以及 Swoole 原生方法調用:Think-Swoole 教程之WebSocket 消息、廣播以及 Swoole 原生方法調用什么是客戶端的 fdfd 是在 Swoole 中客戶端的唯一標識符,fd 是復用的,當連接關閉后 fd 會被新進入的連接復用,正在維持的 TCP 連接 fd 不會被復用。獲取當前客戶端的fdapp/li
        推薦度:
        標簽: 消息 廣播 調用
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 中国人xxxxx69免费视频| 亚洲国产精品专区在线观看 | 四虎永久在线免费观看| 久久久青草青青国产亚洲免观| 91天堂素人精品系列全集亚洲| 亚洲色大18成人网站WWW在线播放| 国产av无码专区亚洲av毛片搜| 一级毛片免费观看不卡的| 国产大片91精品免费看3| 亚洲高清在线播放| 日本高清不卡中文字幕免费 | 女人张开腿给人桶免费视频| 国产亚洲综合网曝门系列| 亚洲精品无码你懂的| 久久不见久久见免费视频7| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | www成人免费视频| 国产午夜免费福利红片| 免费精品视频在线| 国产亚洲人成A在线V网站| 免费日本一区二区| 国产亚洲成人在线播放va| 两个人看的www免费视频中文| 四虎AV永久在线精品免费观看| 免费无码一区二区| 亚洲AV无码一区二区三区DV | 国产免费的野战视频| 亚洲成AV人片在线观看ww| 国产精品九九久久免费视频| 日韩免费福利视频| 亚洲国产成人久久精品软件| 久久这里只有精品国产免费10| 亚洲精品国产福利在线观看| a毛片在线还看免费网站| 91嫩草亚洲精品| 毛片在线看免费版| 国产精品免费久久久久久久久| 亚洲综合日韩中文字幕v在线 | 激情综合亚洲色婷婷五月APP| 免费精品国偷自产在线在线| 亚洲午夜精品在线|