Heim >PHP-Framework >Denken Sie an PHP >WebSocket-Nachrichten, Broadcasts und native Methodenaufrufe von Think-Swoole
Think-Swoole-Tutorial WebSocket-Nachrichten, Broadcasts und Swoole-Native-Methodenaufrufe
Was ist der fd des Clients? fd ist die eindeutige Kennung des Clients in Swoole, die wiederverwendet wird Eingehende Verbindungen werden wiederverwendet und die aufrechterhaltene TCP-Verbindung fd wird nicht wiederverwendet.
Holen Sie sich die FD des aktuellen Clients
app/listener/WsConnect.php
<?php declare (strict_types = 1); namespace app\listener; use \think\swoole\Websocket; class WsTest { /** * 事件监听处理 * * @return mixed */ public function handle($event,Websocket $ws) { // $ws = app('think\swoole\Websocket'); // 单例 //获取当前发送消息客户端的 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>Der Browser öffnet mehrere Registerkarten, um mehrere Clientverbindungen zu simulieren. Alle greifen auf die Datei test.html zu und steuern die Die Station druckt die FD jedes Clients aus. Wie unten gezeigt, öffnen wir drei Registerkarten für den Zugriff:
Mit anderen Worten, die vom Server gesendeten Nachrichten werden von ws.onmessage in HTML empfangen.
Eine Nachricht (einzeln oder in einer Gruppe) an den Client des angegebenen fd sendenapp/listener/WsTest.php<?php declare (strict_types = 1); namespace app\listener; use \think\swoole\Websocket; class WsTest { /** * 事件监听处理 * * @return mixed */ public function handle($event,Websocket $ws) { // $ws = app('think\swoole\Websocket'); // 单例 //获取当前发送消息客户端的 fd var_dump($ws -> getSender()); //发送给指定 fd 的客户端,包括发送者自己 $ws -> to(intval($event['to'])) -> emit('testcallback',$event['message']); } }$ws -> dient zum Festlegen des Empfänger-FD- oder Chatroom-Namens Es können mehrere Personen in einem Array festgelegt werden, z. B. [1,2,3], und fd muss eine Ganzzahl sein. $ws -> emit() ist eine Methode zum Senden von Nachrichten. Der erste Parameter ist der Ereignisname, der in mehreren Szenarien verwendet wird und beliebig definiert werden kann, genau wie der Test im vorherigen Artikel, bei dem der Client eine Nachricht sendet Server. Der zweite Parameter ist der zu sendende Inhalt, der ein String oder ein Array sein kann. Bei separatem Aufruf ohne Angabe des Empfängers wird die Nachricht an den aktuellen fd gesendet. Starten Sie den Think-Swoole-Dienst neu, öffnen Sie drei Clients, um eine Verbindung herzustellen, fd ist jeweils 1, 2, 3. Jetzt verwenden wir den Client mit fd 1, um eine Nachricht an den Client mit fd 2 zu senden:
Nach dem Senden ist ersichtlich, dass nur die Clients mit fd 1 und 2 die Nachricht empfangen können (dh der Absender der Nachricht empfängt die Nachricht auch), während der Client mit fd 3 die Nachricht nicht empfängt :
Nach dem Senden ist ersichtlich, dass nur die Clients mit fd 1 und 2 die Nachricht empfangen können (dh der Absender der Nachricht empfängt die Nachricht auch), während der Client mit fd 3 erhält die Nachricht nicht:
Eine Broadcast-Nachricht senden
Eine Broadcast-Nachricht besteht darin, eine Nachricht an alle Kunden zu senden, jedoch nicht an Sie selbst. app/listener/WsConnect.php<?php declare (strict_types = 1); namespace app\listener; use \think\swoole\Websocket; class WsTest { /** * 事件监听处理 * * @return mixed */ public function handle($event,Websocket $ws) { //获取当前发送消息客户端的 fd var_dump($ws -> getSender()); //发送广播消息 $ws -> broadcast() -> emit('testcallback',$event['message']); } }$ws -> Die Broadcast()-Methode dient zum Senden von Broadcast-Nachrichten. Aber wenn Sie selbst Broadcast-Nachrichten empfangen möchten, müssen Sie ein $ws -> to($ws -> getSender()) -> emit('testcallback',$event['message']) hinzufügen. ; Das ist es. Simulieren Sie einen Client, um eine Nachricht an einen anderen Client zu senden.Angenommen, mein aktueller FD ist 1, ich möchte jedoch simulieren, dass ein Client mit FD 2 verwendet wird, um eine Nachricht an einen Client mit FD 3 zu senden. Legen Sie einfach den Sender-FD und den Empfänger fest Verwenden Sie einfach zwei fds:
$ws -> setSender(2) -> to(3) -> emit('testcallback',$event['message']);Nach dem Test hat 1 die Nachricht nicht erhalten, aber 2 und 3 haben sie beide erhalten. Get SwooleWebSocketServerAngenommen, wir benötigen jetzt eine Funktion, um festzustellen, ob ein Client ein gültiger Client ist, d. h. ob der Handshake mit dem Server erfolgreich ist. Die Think-Swoole-Erweiterung verfügt nicht über diese Funktion, aber wenn man sich die offizielle Swoole-Dokumentation ansieht, gibt es eine isEstablished-Funktion, die die von uns benötigten Funktionen vervollständigen kann. Die Antwort lautet also: Wie man die native Swoole-Funktion über Think-Swoole erhält die SwooleWebSocketServer-Klasse. Es gibt zwei Möglichkeiten: 1. app('swoole.server'); 2. app('thinkswooleManager') ->
$manager = app('think\swoole\Manager'); $manager -> getServer() -> isEstablished(2);Anhang: thinkSwooleWebsocket-Klassenobjektmethode: broadcast Zum Senden von Broadcast-Nachrichten festlegen
Das obige ist der detaillierte Inhalt vonWebSocket-Nachrichten, Broadcasts und native Methodenaufrufe von Think-Swoole. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!