WebSocket-Nachrichten, Broadcasts und native Methodenaufrufe von Think-Swoole

Freigeben: 2020-10-19 14:52:28
nach vorne
3443 Leute haben es durchsucht

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(&#39;think\swoole\Websocket&#39;); // 单例
        //获取当前发送消息客户端的 fd
        var_dump($ws -> getSender());
    }
}
Nach dem Login kopieren

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(&#39;连接成功&#39;);
    }
    ws.onmessage = function(data){
        console.log(data.data);
    }
    ws.onclose = function(){
        console.log(&#39;连接断开&#39;);
    }
    function send()
{
        var message = document.getElementById(&#39;message&#39;).value;
        var to = document.getElementById(&#39;to&#39;).value;
        console.log("准备给" + to + "发送数据:" + message);
        ws.send(JSON.stringify([&#39;test&#39;,{
            to:to,
            message:message
        }])); //发送的数据必须是 [&#39;test&#39;,数据] 这种格式
    }
</script>
</body>
</html>
Nach dem Login kopieren

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. WebSocket-Nachrichten, Broadcasts und native Methodenaufrufe von Think-Swoole

Eine Nachricht (einzeln oder in einer Gruppe) an den Client des angegebenen fd senden

app/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(&#39;think\swoole\Websocket&#39;); // 单例
        //获取当前发送消息客户端的 fd
        var_dump($ws -> getSender());
        //发送给指定 fd 的客户端,包括发送者自己
        $ws -> to(intval($event[&#39;to&#39;])) -> emit(&#39;testcallback&#39;,$event[&#39;message&#39;]);
    }
}
Nach dem Login kopieren

$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 : WebSocket-Nachrichten, Broadcasts und native Methodenaufrufe von Think-Swoole

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: WebSocket-Nachrichten, Broadcasts und native Methodenaufrufe von Think-Swoole

Eine Broadcast-Nachricht senden WebSocket-Nachrichten, Broadcasts und native Methodenaufrufe von Think-Swoole

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(&#39;testcallback&#39;,$event[&#39;message&#39;]);
    }
}
Nach dem Login kopieren

$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(&#39;testcallback&#39;,$event[&#39;message&#39;]);
Nach dem Login kopieren

Nach dem Test hat 1 die Nachricht nicht erhalten, aber 2 und 3 haben sie beide erhalten.

Get SwooleWebSocketServer

Angenommen, 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(&#39;think\swoole\Manager&#39;);
$manager -> getServer() -> isEstablished(2);
Nach dem Login kopieren

Anhang: thinkSwooleWebsocket-Klassenobjektmethode:

broadcast Zum Senden von Broadcast-Nachrichten festlegen

  • isBroadcast Bestimmen Sie, ob der aktuelle Broadcast-Modus

  • to ist. Legen Sie den Empfänger-FD oder den Chatroom-Namen fest (kann eingestellt werden). ein Array) Mehrfach)

  • getTo Ruft den Empfänger-FD oder Chatroom-Namen ab

  • join Der aktuelle Client tritt dem angegebenen Chatroom bei (kann mehrere sein)

  • leave Der aktuelle Client verlässt den angegebenen Chatroom ( kann mehrere sein) )

  • emit Nachricht senden

  • close Schließen Sie die aktuelle Verbindung

  • getSender Holen Sie sich die aktuelle Client-ID (d. h. fd)

  • setSender Legen Sie den fd des Absenders fest

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!

Verwandte Etiketten:
Quelle:阿dai哥
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!