Я занимаюсь разработкой приложения для онлайн-чата, в котором группа пользователей может видеть и отправлять сообщения в модельную комнату, в которой они присутствуют. Для этого я использую websocket и php.
Но когда пользователь отправляет какие-либо сообщения, он передается всем пользователям, а не комнате, в которой он / она присутствует. Ниже приведен мой пример кода.
function send_message($msg) {
global $clients;
foreach ($clients as $changed_socket) {
@socket_write($changed_socket, $msg, strlen($msg));
}
return true;
}
Пожалуйста, дайте ваш ценный отзыв.
Из представленного кода видно, что ваш $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.');
Лучшим долгосрочным решением является создание пользовательского класса и ведение списка экземпляров, но основы все те же: назначьте дескриптор свойству, а не передавайте дескрипторы необработанным.
Других решений пока нет …