在Socket.IO中的客户端之间快速访问变量

时间:2020-08-31 05:25:53

标签: socket.io

(我之所以要回答这个问题,是因为我认为这可能有用,但是如果有任何问题,请告诉我。)

在Socket.IO的套接字对象中设置和获取自定义变量对于要与该连接关联的临时数据非常方便。

在聊天室示例中(在这种情况下,我使用的是PHP,但应该可以轻松翻译),脚本在其中存储用户名:

$socket->on('add user', function ($username) use ($socket) {
    $socket->username = $username;

然后可以在广播中使用:

$socket->broadcast->emit('user joined', array(
        'username' => $socket->username,
        'numUsers' => $numUsers
    ));

我遇到的问题是如何在套接字(连接)之间“共享”变量数据而不(或在之前)发出变量数据?这对于管理更复杂的聊天室或类似游戏(可能需要处理这些数据而不发出信号)的游戏很有用。

我可以想到有一些方法可以做到这一点,例如管理不同的数组或使用数据库存储和检索-但是,如果您不需要显式地这样做,它们似乎是多余的。

我在这方面找不到很多文档。

1 个答案:

答案 0 :(得分:0)

以聊天室为例,这是我想出的:

假设您要设置并获取特定房间中每个人的年龄:

$socket->on('add user', function ($username,$age) use ($socket) {
    $socket->age = $age;

我创建了一个函数来收集房间中每个人的唯一连接ID:

function clients_in_the_room($room)
{
    GLOBAL $io;
    $clients_in_the_room = $io->sockets->adapter->rooms[$room];
    $clients_in_the_room = array_keys($clients_in_the_room);    
    return $clients_in_the_room;
}

$ io->套接字->适配器-> rooms [$ room];只是要给我们一个带有布尔值的数组,所以我抓到了array_keys,这是我想要的id,它们非常有用。

    $clients_in_the_room = clients_in_the_room('Lobby');

现在我们有了这些ID,我们可以访问那些我想要的套接字变量:

function socket_age($socketid) {
    GLOBAL $io;
    $age = $io->sockets->connected[$socketid]->age;
    return $age;
}

美丽。为了清楚起见,我可以发出所有这些数据...

    foreach($clients_in_the_room as $clientsId) {
        $age = socket_age($clientsId);
        $output = "Connection ID: $clientsId Age: $age.";
        $socket->broadcast->emit('new message', array(
             'username' => $socket->username,
             'message' => $output
        ));
    };

但是显然我们不想通常要这样做。知道如何快速访问这些变量非常有用。希望这是有用的。