отправить сообщение клиенту из веб-сокета с храповым механизмом

Я создаю сервер веб-сокетов из этого руководства https://www.sitepoint.com/how-to-quickly-build-a-chat-app-with-ratchet/ теперь я хочу знать, как я могу отправить сообщение на конкретное соединение. это мой код. в этих кодах отправьте сообщение всем соединениям, но я хочу знать, какое соединение отправляет мне сообщение, а затем отправляет сообщение этому соединению.

мой клиент js

(function(){

var user;
var messages = [];

function updateMessages(msg){
    messages.push(msg);
}

var conn = new WebSocket('ws://127.0.0.1:4510');
conn.onopen = function(e) {
console.log("Connection established!");
conn.onmessage = function(e) {
    var msg = JSON.parse(e.data);
    alert(msg);
    updateMessages(msg);
};
conn.onclose = function () {
    // conn.close();
}; // disable onclose handler first
var i = 0;
$('#start').click(function(){
    user = $('#user').val();
    var msg = {
    "name" : 'start' 
};
updateMessages(msg);
conn.send(JSON.stringify(msg));
});
};
})();

и мой файл сервера php

    <? 
protected $clients;
public $i = 0;
public function __construct() {
    $this->clients = new \SplObjectStorage;
}

public function onOpen(ConnectionInterface $conn) {

    $this->clients->attach($conn);
    echo "New connection! ({$conn->resourceId})\n";

}

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

        foreach ($this->clients as $client) {
            if ($from !== $client) {

                $client->send($rsid);
            }
        }

}

public function onClose(ConnectionInterface $conn) {

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

    echo "Connection {$conn->resourceId} has disconnected\n";
}

public function onError(ConnectionInterface $conn, \Exception $e) {
    echo "An error has occurred: {$e->getMessage()}\n";

    $conn->close();
}

person user3725280    schedule 12.12.2017    source источник
comment
Вам удалось решить вашу проблему?   -  person sanjihan    schedule 17.01.2018


Ответы (1)


У меня была похожая проблема несколько дней назад, и я, наконец, нашел хороший способ справиться со всеми соединениями:

Вместо того, чтобы делать

var conn = new WebSocket('ws://127.0.0.1:4510');

Я передаю userId в виде URL-запроса следующим образом:

var conn = new WebSocket('ws://127.0.0.1:4510/?id=123');

На стороне сервера сохраните идентификатор пользователя и входящее соединение в виде пары ключ-значение в массиве PHP. Когда вы хотите отправить конкретному пользователю, просто проиндексируйте этот массив, и вы получите соединение.

        $query = $conn->httpRequest->getUri()->getQuery();
        //get query from URL like ws://127.0.0.1:8080/?id=123456
        $query_list = explode("&", $query);
        $user_id = trim(substr($query_list[0], 3));
        $this->users[$user_id] = $conn;

Если вы также хотите ограничить одно соединение для каждого пользователя и уведомить старое соединение, если тот же пользователь входит в систему в другом месте, вы можете обратиться к моему коду здесь:

https://github.com/tli4/ratchet-practice

person Troy    schedule 07.04.2018
comment
не могли бы вы немного помочь мне с этим решением - person Abhi Burk; 23.04.2018