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('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>
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 :
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('think\swoole\Websocket'); // 单例 //获取当前发送消息客户端的 fd var_dump($ws -> getSender()); //发送给指定 fd 的客户端,包括发送者自己 $ws -> to(intval($event['to'])) -> emit('testcallback',$event['message']); } }
$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 :
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 :
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 :
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('testcallback',$event['message']); } }
$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('testcallback',$event['message']);
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('think\swoole\Manager'); $manager -> getServer() -> isEstablished(2);
Pièce jointe : méthode d'objet de classe thinkSwooleWebsocket :
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!