向一组用户显示消息,而不是在 php 中使用 Websocket 的所有用户


Show message to a group of users instead of all users using Websocket in php

我正在开发一个在线视频聊天应用程序,其中一组用户可以查看并向他们所在的模型室发送消息。为此,我正在使用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.');

更好的长期解决方案是创建一个用户类并保留实例列表,但基础知识是相同的:将句柄分配给属性,而不是传递原始句柄。