как обрабатывать несколько соединений сокетов одного клиента в Ratchet - PullRequest
0 голосов
/ 24 сентября 2018

Я работаю в системе чата в реальном времени, в которой один пользователь может отправлять / получать сообщения определенному пользователю.Я использую Laravel и в контроллере Я сопоставляю объект соединения с resourceId.

$ this-> connections [$ conn-> resourceId] = $ conn;

Чтобы найти resource_Id конкретного пользователя, я сохраняю resource_Id этого пользователя в базе данных под его уникальным идентификатором.Таким образом, я могу найти resource_Id пользователя с его unique_id, а затем я могу найти объект интерфейса подключения, верно.

Когда user_1 отправляет сообщение user_2, user_2 успешно получает это сообщение.

В чем моя проблема ???

Предположим, что user2 открывает вкладку, скажем tab1, и соединение создано, он успешно получает сообщение от user_1.Пользователь_2 открывает другую вкладку, затем создается новое соединение, и теперь, если он получит сообщение, оно появится только на tab_2 , но я хочу, чтобы оно появилось на обеих вкладках.

Я знаю, почему оно появляетсяна tab_2, когда создается второе соединение, оно перезаписывает уже существующий resource_id в базе данных, поскольку я сохраняю только один resource_id для каждого пользователя.

Есть ли способ, которым обе вкладки обрабатываются одним и тем же объектом соединения.

У меня есть решение.Я думаю, что я должен хранить несколько идентификаторов ресурсов против user_id в базе данных, чтобы я мог получить доступ ко всем соединениям конкретного пользователя и затем отправить сообщение всем соединениям.Это правильный подход, чтобы сделать это в моем случае?

вот код функции onOpen контроллера

    function onOpen(ConnectionInterface $conn){
    $this->connections[$conn->resourceId]=$conn;

    $data=['action'=>'map_resource_id','resourceid'=>($conn->resourceId)];
    //send the resource id to client to map this id against user_id
    //the client send an ajax request to store the resource id against 
    //user_id
    $conn->send(json_encode($data));

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

Код для метода onClose здесь

function onClose(ConnectionInterface $conn){
   unset($this->connections[$conn->resourceId]);
   $status=DB::update('update sockets set resource_id=0 where resource_id='.$conn->resourceId);

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

}
...