(我问并回答这个问题是因为我认为它可能有用,但如果这里有任何缺陷,请告诉我。(
在Socket.IO的Socket对象中设置和获取自定义变量对于您想要与该连接关联的短暂数据来说非常方便。
在聊天室的例子中,(在这个例子中,我使用的是PHP,但它应该很容易翻译(脚本将用户名存储在那里:
$socket->on('add user', function ($username) use ($socket) {
$socket->username = $username;
然后你可以在广播中使用:
$socket->broadcast->emit('user joined', array(
'username' => $socket->username,
'numUsers' => $numUsers
));
我遇到的问题是,如何在套接字(连接(之间"共享"变量数据,而不发送(或在发送之前(?这将有助于管理更复杂的聊天室,或者像游戏一样,你可能想使用这些数据而不发射。
我能想到一些方法可以完成这项工作,比如管理不同的数组,或者用数据库存储和检索——但如果你不明确需要这样做,它们似乎是多余的
我找不到太多关于这方面的文件。
坚持聊天室的例子,这就是我想到的:
假设你想设定并获取特定房间中每个人的年龄:
$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->插座->适配器->房间[$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
));
};
但很明显,我们通常不想这样做。知道如何快速访问这些变量是非常有用的。希望这是有用的。