Wie zum senden von Nachrichten an bestimmte Benutzer Ratchet PHP Websocket
Ich versuche, ein system zu erstellen, wo Benutzer abonnieren kann, um eine Kategorie, auf der Verbindung zum websocket-server und dann wird er beginnen die updates für die Kategorie. Bisher habe ich mich mit Ratsche und ich bin in der Lage, senden Sie die Nachricht an alle angeschlossenen clients, aber das problem ist, ich will nicht senden Sie die Nachricht an alle Klienten, die ich nur wollen, senden Sie die Nachricht an die clients, die sich angemeldet haben die Kategorie, in der die Nachrichten gesendet wurde.
PHP-Code
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();
?>
Client-Seite in js-code
<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>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grundsätzlich, wenn Sie möchten, eine syntax für das senden von Daten an den WebSocket, ich empfehlen die Verwendung einer JSON-Objekt, dies zu tun. In Ihrem WebSocket-Klasse müssen Sie eine lokale variable namens
subscriptions
und eine lokale variable namensusers
so gerne.Javascript, um mit zu gehen, die sieht ein bisschen aus wie diese
Hinweis: Dieser code ist ungetestet, ich schrieb es auf die Fliegen aus meiner Erfahrung mit Ratsche. Viel Glück 🙂
user3049006 fand ich diesen code in meine Forschung, um die Verbindung dauerhaft gespeichert, wenn Sie fehlschlagen, wiederholen Sie die Verbindung erneut.