<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
        主站蜘蛛池模板: 免费国产怡红院在线观看| 黄网站色在线视频免费观看| 国产精品另类激情久久久免费| 免费一级毛片不卡在线播放| 国产精品亚洲精品久久精品| 尤物永久免费AV无码网站| 成a人片亚洲日本久久| 免费人成在线观看播放国产| 特级毛片爽www免费版| 中文字幕人成人乱码亚洲电影| 99免费在线视频| 亚洲综合自拍成人| 免费无码黄十八禁网站在线观看| 亚洲日本国产综合高清| 久久亚洲日韩看片无码| 91久久精品国产免费直播| 亚洲三级中文字幕| 在线观看亚洲免费视频| 中文字幕在线免费观看视频| 99人中文字幕亚洲区| 成人无遮挡毛片免费看| 曰批全过程免费视频观看免费软件| 国产l精品国产亚洲区在线观看| 97在线视频免费| 日本亚洲中午字幕乱码| 国产成A人亚洲精V品无码| 波多野结衣中文字幕免费视频| 亚洲av乱码一区二区三区按摩| 久久精品国产亚洲Aⅴ蜜臀色欲| 国产99视频精品免费专区| 亚洲人成网男女大片在线播放 | 亚洲mv国产精品mv日本mv| 18禁超污无遮挡无码免费网站国产 | 国产免费人成视频在线观看| 一级全免费视频播放| 久久精品亚洲精品国产色婷| 日韩免费福利视频| 2021精品国产品免费观看| 在线亚洲精品视频| 亚洲视频国产视频| 亚洲人成影院在线观看|