我正在制作ios聊天应用程序。在研究了所需的技术和协议之后,我决定尝试使用websockets。由于我们的堆栈顶部是基于PHP的原因,我开始了解棘轮作为PHP的websockets。我通过阅读documentation为ios前端制作了简单的聊天服务器。聊天工作非常好,我也很满意。我想知道如何创建单独的私人聊天室。 是否需要为不同的房间运行不同的套接字事件循环实例?
我制作的样本服务器正在使用单个事件循环 管理用户连接并将消息分派给不同的人 连接/用户ID。我真的试图寻找创造私人 聊天室,但没有找到任何我可能的信息 信心。我是否必须虚拟地管理每个连接/用户ID 在此事件循环中,例如决定哪些用户可以相互聊天 直接通过控制消息的调度?或者是他们的 真的是另外一种方法吗?这是事件循环样本 我实施的par文件:
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();
我想告诉我,我是一名ios / android开发人员,并且真的没有专家或对网络前端/后端技术有流畅的了解。我做网络编程作为一种爱好,我尽我所能进行所有搜索和研究,因此请不要介意我的任何问题听起来都很愚蠢。
谢谢,
答案 0 :(得分:1)
是否需要为不同的房间运行不同的套接字事件循环实例?
没有。只需要一个循环。你的片段很好。您需要做的是调整Chat
类,以便它接受来自用户输入的附加参数 - 房间ID /名称。
例如,用户发送消息{"cmd":"msg", "message":"Hi", "room": 1}
,然后Chat
应仅将消息发送给加入该会议室的用户。当然,您应该实现其他用户方法,例如{"cmd":"join", "room": 1}
,{"cmd":"leave", "room": 1}
答案 1 :(得分:0)
我可能有点迟到回答,但在这里我是怎么做到的。
你应该在Chat类上实现WampServerInterface而不是MessageComponentInterface(如果你还没有这样做的话)。
如上所述,您的代码段很好。
这是我的聊天课程:
class Chat implements WampServerInterface
{
protected $conversationId;
public function __construct(){
$this->conversationId = null;
}
public function onSubscribe(ConnectionInterface $conn, $conversation_id){
$this->conversationId = $conversation_id;
echo "Client $conn->resourceId assigned to the conversation : $conversation_id\n";
}
public function onPublish(ConnectionInterface $conn, $conversation_id, $event, array $exclude, array $eligible){
echo "Message sent to $conversation_id : $event";
// ... save in Database or else
// Send data to conversation
$this->conversationId->broadcast($message);
}
}
这仅用于连接一个房间。
但是如果你想同时运行多个聊天室,你应该看看Github上的棘轮代码。
我不知道你为前端使用了什么,我个人使用autobahn.js来实例化与服务器的连接(使用棘轮)。