在 php 中向一组用户而不是所有使用 Websocket 的用户显示消息
Show message to a group of users instead of all users using Websocket in php
我正在开发一个在线视频聊天应用程序,一组用户可以在其中查看并向他们所在的样板间发送消息。为此,我正在使用 websocket 和 php.
但是,当用户发送任何消息时,它将发送给所有用户,而不是 he/she 所在的房间。下面是我的示例代码。
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.');
一个更好的长期解决方案是创建一个用户 class 并保留一个实例列表,但基础是相同的:将句柄分配给 属性 而不是传递句柄大约原始。
我正在开发一个在线视频聊天应用程序,一组用户可以在其中查看并向他们所在的样板间发送消息。为此,我正在使用 websocket 和 php.
但是,当用户发送任何消息时,它将发送给所有用户,而不是 he/she 所在的房间。下面是我的示例代码。
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.');
一个更好的长期解决方案是创建一个用户 class 并保留一个实例列表,但基础是相同的:将句柄分配给 属性 而不是传递句柄大约原始。