国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答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類對象方法:

  • broadcast 設置進行廣播消息發送

  • isBroadcast 判斷當前是否是廣播模式

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

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

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

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

  • emit 消息發送

  • close 關閉當前連接

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

  • setSender 設置發件人的 fd

  • 聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。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
    主站蜘蛛池模板: 亚洲欧美另类在线观看 | 亚洲欧美另类在线观看 | 在线观看国产视频 | 国产精品va在线观看无 | 日韩最新视频一区二区三 | 亚洲激情综合 | 日韩欧美综合视频 | 国产日韩欧美在线 | 特黄日韩免费一区二区三区 | 欧美成人伊人久久综合网 | 图片区 日韩 欧美 亚洲 | 亚洲一区二区三区在线 | 免费看成人国产一区二区三区 | 亚洲第二页 | 中文国产成人精品久久一 | 欧美日韩一本 | 一道精品视频一区二区三区男同 | 美日韩中文字幕 | 性夜影院爽黄a爽免费看网站 | 国产日韩欧美自拍 | 亚洲国产欧美91 | 国产日韩欧美在线播放 | 欧美a色爱欧美综合v | 精品欧美一区二区三区精品久久 | 精品欧美一区二区在线观看 | 欧美日韩国产亚洲人成 | 一区二区三区在线播放 | www.欧美色图 | 日韩一级精品久久久久 | 国产精品一区二区久久不卡 | 欧美精品亚洲人成在线观看 | 亚洲精品一二区 | 日韩第七页 | 久久国产成人精品国产成人亚洲 | 欧美1区二区三区公司 | 亚洲视频入口 | 日韩免费高清视频 | 特黄一级毛片 | 国产图区 | 国产网站精品 | 人人爽天天碰天天躁夜夜躁 |