как получить объект подключения конкретного пользователя?
Я работаю в режиме реального времени Symfony приложение, с помощью Храповой библиотека, в этом приложении мне нужно отправить некоторые данные конкретному пользователю, поэтому логическое решение должно было использовать SessionProvider это прикрепит объект сеанса Symfony2 к каждому входящему объекту соединения. В документации говорится, что я настроил обработчик неродного сеанса для хранения моих сеансов, т. е. в базе данных через PDO. и это прекрасно работает в данный момент, но мне нужно установить связь. объект конкретного пользователя, чтобы отправить ему некоторые данные, так что по-другому мне нужно найти объект соединения, который ссылается на этого пользователя, и я не могу найти способ сделать это ? это мой серверный код:
$app=new AggregateApplication();
$loop = ReactEventLoopFactory::create();
$context = new ReactZMQContext($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:5555');
$pull->on('message', array($app, 'onNotification'));
$webSock = new ReactSocketServer($loop);
$webSock->listen(8080, '127.0.0.1');
$handler = $this->getContainer()->get('session.handler');
$server=new RatchetWampWampServer($app);
$server = new SessionProvider($server, $handler);
$webServer = new RatchetServerIoServer(new RatchetWebSocketWsServer($server),$webSock);
$loop->run();
2 ответов
У меня был точно такой же вопрос (минус Symfony), и вот что я сделал.
на основе Привет мир учебник, Я заменил SplObjectStorage с массивом. Прежде чем представить мои изменения, я хотел бы прокомментировать, что если вы следовали через этот учебник и поняли его, единственное, что помешало вам прийти к этому решению самостоятельно, вероятно, не зная, что SplObjectStorage есть.
class Chat implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = array();
}
public function onOpen(ConnectionInterface $conn) {
// Store the new connection to send messages to later
$this->clients[$conn->resourceId] = $conn;
echo "New connection! ({$conn->resourceId})\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
$numRecv = count($this->clients) - 1;
echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n"
, $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');
foreach ($this->clients as $key => $client) {
if ($from !== $client) {
// The sender is not the receiver, send to each client connected
$client->send($msg);
}
}
// Send a message to a known resourceId (in this example the sender)
$client = $this->clients[$from->resourceId];
$client->send("Message successfully sent to $numRecv users.");
}
public function onClose(ConnectionInterface $conn) {
// The connection is closed, remove it, as we can no longer send it messages
unset($this->clients[$conn->resourceId]);
echo "Connection {$conn->resourceId} has disconnected\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "An error has occurred: {$e->getMessage()}\n";
$conn->close();
}
}
Of конечно, чтобы сделать его действительно полезным, вы также можете добавить соединение с БД и сохранить/получить эти resourceIds.
это то, что я сделал, имеет некоторые улучшения на той же идее.
добавляет 2 функции, которые вы можете вызвать в другом месте: send_to () и multicast ().
namespace mine;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class ws implements MessageComponentInterface {
protected $clients;
protected $clientids;
public function __construct() {
$this->clients = new \SplObjectStorage;
$this->clientids = array();
}
public function multicast($msg) {
foreach ($this->clients as $client) $client->send($msg);
}
public function send_to($to,$msg) {
if (array_key_exists($to, $this->clientids)) $this->clientids[$to]->send($msg);
}
public function onOpen(ConnectionInterface $conn) {
$socket_name = "{$conn->resourceId}@{$conn->WebSocket->request->getHeader('X-Forwarded-For')}";
$this->clients->attach($conn,$socket_name);
$this->clientids[$socket_name] = $conn;
}
public function onMessage(ConnectionInterface $from, $msg) {
$this->multicast($msg);
}
public function onClose(ConnectionInterface $conn) {
unset($this->clientids[$this->clients[$conn]]);
$this->clients->detach($conn);
}
public function onError(ConnectionInterface $conn, \Exception $e) {
$conn->close();
}
}