Показывать сообщение группе пользователей вместо всех пользователей, использующих Websocket в Stack Overflow

Я занимаюсь разработкой приложения для онлайн-чата, в котором группа пользователей может видеть и отправлять сообщения в модельную комнату, в которой они присутствуют. Для этого я использую websocket и php.

Но когда пользователь отправляет какие-либо сообщения, он передается всем пользователям, а не комнате, в которой он / она присутствует. Ниже приведен мой пример кода.

function send_message($msg) {
global $clients;
foreach ($clients as $changed_socket) {
@socket_write($changed_socket, $msg, strlen($msg));
}
return true;
}

Пожалуйста, дайте ваш ценный отзыв.

2

Решение

Из представленного кода видно, что ваш $clients массив содержит только дескриптор сокета для этого конкретного соединения.

Найдите строку на вашем сервере, которая имеет функцию socket_accept(), Это, вероятно, будет выглядеть так:

$clients[] = socket_accept($socket);

Моим личным выбором для быстрого и грязного исправления было бы изменить его следующим образом:

$handle = socket_accept($socket);
$client = array('handle' => $handle,
'rooms' => array(),
// additional properties...
);
$clients[] = $client;

Затем, когда вы хотите отправить сообщение в определенную комнату:

function send_message($message, $handle) {
socket_write($handle, $message, strlen($message);
}

function broadcast($message, $room = null) {
global $clients;
foreach ($clients as $client) {
if (is_null($room) || in_array($room, $client['rooms'])) {
send_message($message, $client['handle']);
}
}
}

broadcast('This message will only go to users in the room "lobby"', 'lobby');
broadcast('This message will go to everybody on the server.');

Лучшим долгосрочным решением является создание пользовательского класса и ведение списка экземпляров, но основы все те же: назначьте дескриптор свойству, а не передавайте дескрипторы необработанным.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]