這篇文章主要介紹了Think-Swoole之WebSocket消息、廣播以及 Swoole 原生方法怎么調(diào)用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),右江企業(yè)網(wǎng)站建設(shè),右江品牌網(wǎng)站建設(shè),網(wǎng)站定制,右江網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,右江網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
什么是客戶端的 fd
fd 是在 Swoole 中客戶端的唯一標(biāo)識(shí)符,fd 是復(fù)用的,當(dāng)連接關(guān)閉后 fd 會(huì)被新進(jìn)入的連接復(fù)用,正在維持的 TCP 連接 fd 不會(huì)被復(fù)用。
獲取當(dāng)前客戶端的fd
app/listener/WsConnect.php
getSender()); } }
test.html
Document 消息: 接收者:
瀏覽器打開(kāi)多個(gè)標(biāo)簽,來(lái)模擬多個(gè)客戶端連接,均訪問(wèn) test.html 文件,控制臺(tái)將會(huì)打印出每個(gè)客戶端的 fd ,如下圖我們打開(kāi)三個(gè)標(biāo)簽進(jìn)行訪問(wèn):
也就是說(shuō),服務(wù)端發(fā)送過(guò)來(lái)的消息,都會(huì)被 HTML 中的 ws.onmessage 接收到。
給指定 fd 的客戶端發(fā)送消息(單發(fā)、群發(fā))
app/listener/WsTest.php
getSender()); //發(fā)送給指定 fd 的客戶端,包括發(fā)送者自己 $ws -> to(intval($event['to'])) -> emit('testcallback',$event['message']); } }
$ws -> to()是設(shè)置收件人 fd 或聊天室名,如果發(fā)送給多個(gè)人可以數(shù)組設(shè)置多個(gè),例如 [1,2,3],fd 須為整型。$ws -> emit() 是發(fā)送消息方法,第一個(gè)參數(shù)是事件名稱,用于多場(chǎng)景,可任意定義,就如上一片文章中客戶端給服務(wù)端發(fā)送消息的 Test 一樣。第二個(gè)參數(shù)是發(fā)送的內(nèi)容,可以是字符串、數(shù)組,單獨(dú)調(diào)用不設(shè)置收件人的話,就是發(fā)送消息給當(dāng)前 fd 。
重啟 Think-Swoole 服務(wù),分別打開(kāi)三個(gè)客戶端進(jìn)行連接,fd 分別為 1、2、3,現(xiàn)在,現(xiàn)在,我們用 fd 為 1 的客戶端,發(fā)消息給 fd 為 2 的客戶端:
發(fā)送后,可見(jiàn)只有 fd 為 1、2 的客戶端能收到消息(也就是說(shuō)消息發(fā)出者自身也會(huì)收到消息),而 fd 為 3 的客戶端卻沒(méi)有收到消息:
發(fā)送后,可見(jiàn)只有 fd 為 1、2 的客戶端能收到消息(也就是說(shuō)消息發(fā)出者自身也會(huì)收到消息),而 fd 為 3 的客戶端卻沒(méi)有收到消息:
發(fā)送廣播消息
廣播消息就是發(fā)送一條消息給所有客戶端,但是不包括自己。
app/listener/WsConnect.php
getSender()); //發(fā)送廣播消息 $ws -> broadcast() -> emit('testcallback',$event['message']); } }
$ws -> broadcast() 方法就是發(fā)送廣播消息。
但是如果想自己也收到廣播消息,那就需要增加一條 $ws -> to($ws -> getSender()) -> emit('testcallback',$event['message']); 即可。
模擬客戶端給另一個(gè)客戶端發(fā)消息
假設(shè)我當(dāng)前 fd 為 1,但是我要模擬 用 fd 為 2 的客戶端給 fd 為 3 的客戶端發(fā)送消息,只需設(shè)置發(fā)送者 fd 和接收者兩個(gè) fd 即可:
$ws -> setSender(2) -> to(3) -> emit('testcallback',$event['message']);
經(jīng)測(cè)試,1 沒(méi)有收到消息,2 和 3 都收到了。
獲取 Swoole\WebSocket\Server
假設(shè)說(shuō)我們現(xiàn)在需要一個(gè)功能,判斷一個(gè)客戶端是否為有效客戶端,即是否與服務(wù)端握手成功。Think-Swoole 擴(kuò)展中沒(méi)有這個(gè)功能,但是查閱 Swoole 官方文檔,有個(gè) isEstablished 函數(shù)可以完成我們需要的功能,那么怎樣通過(guò) Think-Swoole 拿到原生 Swoole 函數(shù)呢,答案就是獲取 Swoole\WebSocket\Server 這個(gè)類。有兩種方式:
1、app('swoole.server');
2、app('think\swoole\Manager') -> getServer();
實(shí)例化后,就可以調(diào)用 Swoole 原生方法了,如:
$manager = app('think\swoole\Manager'); $manager -> getServer() -> isEstablished(2);
附:\think\Swoole\Websocket類對(duì)象方法:
broadcast 設(shè)置進(jìn)行廣播消息發(fā)送
isBroadcast 判斷當(dāng)前是否是廣播模式
to 設(shè)置收件人 fd 或聊天室名(可以數(shù)組設(shè)置多個(gè))
getTo 獲取收件人 fd 或聊天室名
join 當(dāng)前客戶端加入到指定聊天室(可以多個(gè))
leave 當(dāng)前客戶端離開(kāi)指定聊天室(可以多個(gè))
emit 消息發(fā)送
close 關(guān)閉當(dāng)前連接
getSender 獲取當(dāng)前客戶端 id(即fd)
setSender 設(shè)置發(fā)件人的 fd
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Think-Swoole之WebSocket消息、廣播以及 Swoole 原生方法怎么調(diào)用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!