Maison >cadre php >PensezPHP >Messages WebSocket, diffusions et appels de méthodes natives Swoole de Think-Swoole

Messages WebSocket, diffusions et appels de méthodes natives Swoole de Think-Swoole

藏色散人
藏色散人avant
2020-10-19 14:52:283509parcourir

Tutoriel Think-Swoole Messages WebSocket, diffusions et appels de méthode native Swoole

Quel est le fd du client

fd est l'identifiant unique du client dans Swoole , fd est réutilisé lorsque la connexion est fermée, fd sera réutilisé par la connexion nouvellement entrée. La connexion TCP fd maintenue ne sera pas réutilisée.

Obtenir le fd du client actuel

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());
    }
}

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>

Ouvrir le navigateur Plusieurs balises pour simuler plusieurs connexions client, toutes accèdent au fichier test.html, la console imprimera le fd de chaque client, comme indiqué ci-dessous nous ouvrons trois balises pour l'accès :

Messages WebSocket, diffusions et appels de méthodes natives Swoole de Think-Swoole

En d'autres termes, les messages envoyés par le serveur seront reçus par ws.onmessage en HTML.

Envoyer un message au client du fd spécifié (simple ou groupe)

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;]);
    }
}

$ws -> le paramètre Destinataire fd ou nom de la salle de discussion Si vous envoyez à plusieurs personnes, vous pouvez définir plusieurs tableaux, tels que [1,2,3], fd doit être un nombre entier. $ws -> submit() est une méthode d'envoi de message. Le premier paramètre est le nom de l'événement, qui est utilisé dans plusieurs scénarios et peut être défini arbitrairement, tout comme le test de l'article précédent où le client envoie un message au client. serveur. Le deuxième paramètre est le contenu à envoyer, qui peut être une chaîne ou un tableau. S'il est appelé séparément sans définir le destinataire, le message sera envoyé au fd actuel.

Redémarrez le service Think-Swoole et ouvrez trois clients pour vous connecter. Le fd est 1, 2 et 3. Maintenant, maintenant, nous utilisons le client avec fd 1 pour envoyer un message au client avec fd 2. . Client :

Messages WebSocket, diffusions et appels de méthodes natives Swoole de Think-Swoole

Après l'envoi, on constate que seuls les clients avec fd 1 et 2 peuvent recevoir le message (c'est-à-dire que l'expéditeur du message le recevra). reçoivent également le message). Cependant, le client avec fd 3 n'a pas reçu le message :

Messages WebSocket, diffusions et appels de méthodes natives Swoole de Think-Swoole

Après l'envoi, on constate que seuls les clients avec fd 1 et 2 peut recevoir le message (c'est-à-dire que le message L'expéditeur lui-même recevra également le message), mais le client avec fd de 3 n'a pas reçu le message :

Messages WebSocket, diffusions et appels de méthodes natives Swoole de Think-Swoole

Envoi d'un message diffusé

Le message diffusé est Envoyer un message à tous les clients sauf vous-même.

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;]);
    }
}

$ws -> La méthode Broadcast() consiste à envoyer des messages diffusés.

Mais si vous souhaitez recevoir vous-même des messages diffusés, vous devez ajouter un $ws -> à($ws -> getSender()) -> message']); C'est tout.

Simuler un client pour envoyer un message à un autre client

Supposons que mon fd actuel soit 1, mais que je souhaite simuler l'utilisation d'un client avec fd 2 pour envoyer un message à un client avec fd 3 . Définissez simplement l'expéditeur fd et le destinataire fd :

$ws -> setSender(2) -> to(3) -> emit(&#39;testcallback&#39;,$event[&#39;message&#39;]);

Après le test, 1 n'a pas reçu le message, mais 2 et 3 l'ont tous deux reçu.

Obtenir SwooleWebSocketServer

Supposons que nous ayons maintenant besoin d'une fonction pour déterminer si un client est un client valide, c'est-à-dire si la prise de contact avec le serveur réussit. L'extension Think-Swoole n'a pas cette fonction, mais en regardant la documentation officielle de Swoole, il existe une fonction isEstablished qui peut compléter les fonctions dont nous avons besoin. Alors, comment obtenir la fonction native Swoole via Think-Swoole, la réponse est d'obtenir. la classe SwooleWebSocketServer. Il existe deux manières :

1. app('swoole.server');

2. app('thinkswooleManager') -> Après avoir été transformé, vous pouvez appeler des méthodes natives Swoole, telles que :

$manager = app(&#39;think\swoole\Manager&#39;);
$manager -> getServer() -> isEstablished(2);

Pièce jointe : méthode d'objet de classe thinkSwooleWebsocket :

    paramètres de diffusion pour envoyer des messages de diffusion
  • isBroadcast détermine si le mode actuel est diffusé
  • pour définir le nom du destinataire ou du salon de discussion (peut définir plusieurs tableaux)
  • getTo Obtenez le nom du destinataire ou le nom de la salle de discussion
  • join Le client actuel rejoint la salle de discussion spécifiée (peut être multiple)
  • quitter Le client actuel quitte la salle de discussion spécifiée (peut être plusieurs)
  • émettre un message est envoyé
  • fermer ferme la connexion actuelle
  • fermer ferme la connexion actuelle
  • getSender obtient l'identifiant client actuel (c'est-à-dire fd)
  • setSender définit le fd de l'expéditeur

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer