Отправка сообщения клиенту Ratchet PHP Websocket Server - PullRequest
0 голосов
/ 04 февраля 2019

Я использую этот серверный скрипт для создания сервера Websocket (server.php).Это отлично работает.

<?php

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\WebSocket\WsServerInterface;

require 'vendor/autoload.php';
require_once 'db.php';

class MyClass implements MessageComponentInterface, WsServerInterface {

    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {

        $this->clients->attach($conn);

        $name = str_replace('/', '', $conn->httpRequest->getUri()->getPath());

        $resourceId = $conn->resourceId;

        $stmt = $db->prepare("INSERT INTO clients (id, resourceId, name) VALUES (null, :resourceId, :name)");

        $stmt->bindParam(':resourceId', $resourceId, PDO::PARAM_STR);

        $stmt->bindParam(':name', $name, PDO::PARAM_STR);

        $stmt->execute();

        ConnectDB::closeConnection($db);

        echo "Connected (" . $resourceId . ")\n";

    }

    public function onMessage(ConnectionInterface $from, $msg) {

        $name = str_replace('/', '', $conn->httpRequest->getUri()->getPath());

        $request = json_decode($msg);

        if (json_last_error() === JSON_ERROR_NONE) {

            require_once 'process.php';

            $response = processRequest($msg);

            if ($response !== false) {

                $from->send($response);

            }

        } else {

            $from->send('JSON error');
            $ActionType = 'Connect';

        }

            echo "Incoming message - " $name "\n";

    }

    public function onClose(ConnectionInterface $conn) {

        $this->clients->detach($conn);

        echo "Closed\n";

    }

    public function onError(ConnectionInterface $conn, \Exception $e) {

        echo "Error: " . $e->getMessage() . "\n";

        $conn->close();

    }

}

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new MyClass()
        )
    ),
    8080
);

$server->run();

Я сохраняю идентификатор $resourceId = $conn->resourceId; в базе данных.

Я хотел бы сделать еще один сценарий php, в настоящее время test.php, который может отправлять сообщения клиентам через храповик.

Вот test.php

<?php

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\WebSocket\WsServerInterface;

require 'vendor/autoload.php';
require_once 'db.php';

$to = 119; // hard-coded id, not using database yet

$msg = json_encode(array("test" => "test"));

class Sender implements MessageComponentInterface, ConnectionInterface {

    public function send(ConnectionInterface $to, $msg) {
        $client = $this->clients[$to];
        $client->send($msg);
    }

}

Sender::send($to, $msg);

Ошибка:

Fatal error: Declaration of Sender::send() must be compatible with Ratchet\ConnectionInterface::send($data) in test.php on line 20

Это не работает, и я не знаю, правильный ли это подход.Я не хочу отвечать на входящее сообщение (которое в настоящее время работает), а в конечном итоге отправить сообщение из формы на test.php.

Примеры Ratchet (Hello world) в основном используют сервер для ретрансляциисообщения между клиентами.В моем случае я хочу, чтобы сервер общался только назад с отдельными клиентами.Клиенты никогда не общаются друг с другом.Кроме того, форма на test.php не создает клиента и не ожидает ответа.

Может ли кто-нибудь направить меня в правильном направлении для отправки сообщений непосредственно клиентам?

...