使用棘轮创建/管理私人房间



我正在制作iOS聊天应用程序。在研究了所需的技术和协议之后,我决定尝试一下 websockets。由于我们的堆栈顶部是基于php的,我开始知道棘轮作为PHP的websockets。我通过阅读文档为ios前端制作了简单的聊天服务器。聊天工作得很好,我也对它感到满意。我想知道如何创建单独的私人聊天室。是否需要为单独的房间运行不同的套接字事件循环实例?

我制作的示例服务器使用单个事件循环来管理用户连接并将消息调度到不同的连接/用户 ID。我真的试图寻找创建私人聊天室,但没有找到任何我可以自信的信息。

我是否必须在此事件循环中虚拟管理每个连接/用户 ID,例如通过控制消息的调度来决定哪些用户可以直接相互聊天?或者他们真的是一种单独的方法来做到这一点?这是根据我实现的文档的事件循环示例:

   <?php
   use RatchetServerIoServer;
   use RatchetHttpHttpServer;
   use RatchetWebSocketWsServer;
   use MyAppChat;
   
       require dirname(__DIR__) . '/vendor/autoload.php';
   
       $server = IoServer::factory(
           new HttpServer(
               new WsServer(
                   new Chat()
               )
           ),
           8080
       );
   
       $server->run();

我想说的是,我是一名iOS/Android开发人员,实际上不是专家,也不是Web前端/后端技术方面的流利知识。

是否需要为单独的房间运行不同的套接字事件循环实例?

不。只需要一个循环。你的代码段很好。您要做的是调整类Chat以便它接受来自用户输入的附加参数 - 房间 ID/名称。

例如,用户{"cmd":"msg", "message":"Hi", "room": 1}发送消息,则Chat应仅将消息发送给加入该文件室的用户。当然,您应该实现其他用户方法,例如 {"cmd":"join", "room": 1}{"cmd":"leave", "room": 1}

好吧,我回答可能有点晚了,但这是我是如何做到的。

你应该在你的聊天类上实现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_idn";
    }
    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上的Ratchet代码。

我不知道你用什么作为前端,我个人使用高速公路.js来实例化与服务器的连接(使用棘轮)。

最新更新