内容简介:翻译自:https://stackoverflow.com/questions/30953610/how-to-send-messages-to-particular-users-ratchet-php-websocket
我正在尝试构建一个系统,用户可以在建立与websocket服务器的连接时订阅类别,然后他将开始接收该类别的更新.到目前为止,我已经与Ratchet合作,我能够向所有连接的客户端发送消息,但问题是我不想向所有客户端发送消息我只想将消息发送给订阅了该客户端的客户端.发送消息的特定类别.
PHP 代码
Chat.php
<?php namespace MyApp; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; class Chat implements MessageComponentInterface { protected $clients; public function __construct() { $this->clients = new \SplObjectStorage; } public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); } public function onMessage(ConnectionInterface $conn, $msg) { foreach ($this->clients as $client) { if($conn !== $client) $client->send($msg); } } public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); } public function onError(ConnectionInterface $conn, \Exception $e) { echo "An error has occurred: {$e->getMessage()}\n"; $conn->close(); } } ?>
server.php
<?php use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; use MyApp\Chat; require dirname(__DIR__) . '/Ratchet/vendor/autoload.php'; $server = IoServer::factory( new HttpServer( new WsServer( new Chat() ) ), 8080 ); $server->run(); ?>
客户端js代码
<script type="text/javascript"> var conn = new WebSocket('ws://localhost:8080'); conn.onopen = function(e) { console.log("Connection established!"); }; conn.onmessage = function(e) { console.log(e.data); }; </script>
基本上你需要一个语法来发送数据到WebSocket,我建议使用JSON对象来做到这一点.在您的WebSocket类中,您需要一个名为subscriptions的局部变量和一个名为users的局部变量.
<?php namespace MyApp; use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; class Chat implements MessageComponentInterface { protected $clients; private $subscriptions; private $users; public function __construct() { $this->clients = new \SplObjectStorage; $this->subscriptions = []; $this->users = []; } public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); $this->users[$conn->resourceId] = $conn; } public function onMessage(ConnectionInterface $conn, $msg) { $data = json_decode($msg); switch ($data->command) { case "subscribe": $this->subscriptions[$conn->resourceId] = $data->channel; break; case "message": if (isset($this->subscriptions[$conn->resourceId])) { $target = $this->subscriptions[$conn->resourceId]; foreach ($this->subscriptions as $id=>$channel) { if ($channel == $target && $id != $conn->resourceId) { $this->users[$id]->send($data->message); } } } } } public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); unset($this->users[$conn->resourceId]); unset($this->subscriptions[$conn->resourceId]); } public function onError(ConnectionInterface $conn, \Exception $e) { echo "An error has occurred: {$e->getMessage()}\n"; $conn->close(); } } ?>
与之相关的javascript看起来有点像这样
<script type="text/javascript"> var conn = new WebSocket('ws://localhost:8080'); conn.onopen = function(e) { console.log("Connection established!"); }; conn.onmessage = function(e) { console.log(e.data); }; function subscribe(channel) { conn.send(JSON.stringify({command: "subscribe", channel: channel})); } function sendMessage(msg) { conn.send(JSON.stringify({command: "message", message: msg})); } </script>
注意:这段代码是未经测试的,我是根据我对Ratchet的经验编写的.祝好运 :)
翻译自:https://stackoverflow.com/questions/30953610/how-to-send-messages-to-particular-users-ratchet-php-websocket
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 消息队列(七)RocketMQ消息发送
- 消息中间件RocketMQ消息发送
- TNW-发送模板消息
- 分布式事务:消息可靠发送
- 探秘Runtime - Runtime消息发送机制
- 解决事物提交与消息发送顺序问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Intersectional Internet
Safiya Umoja Noble、Brendesha M. Tynes / Peter Lang Publishing / 2016
From race, sex, class, and culture, the multidisciplinary field of Internet studies needs theoretical and methodological approaches that allow us to question the organization of social relations that ......一起来看看 《The Intersectional Internet》 这本书的介绍吧!
html转js在线工具
html转js在线工具
RGB HSV 转换
RGB HSV 互转工具