【问题标题】:Creating/Managing private rooms using Ratchet?使用 Ratchet 创建/管理私人房间?
【发布时间】:2015-02-23 17:48:25
【问题描述】:

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

我制作的示例服务器使用单个事件循环来管理用户连接并将消息发送到不同的连接/用户 ID。我真的很想注意创建私人聊天室,但没有找到任何可以让我有信心的信息。

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

   <?php
   use Ratchet\Server\IoServer;
   use Ratchet\Http\HttpServer;
   use Ratchet\WebSocket\WsServer;
   use MyApp\Chat;
   
       require dirname(__DIR__) . '/vendor/autoload.php';
   
       $server = IoServer::factory(
           new HttpServer(
               new WsServer(
                   new Chat()
               )
           ),
           8080
       );
   
       $server->run();

我想说的是,我是一名 iOS/Android 开发人员,在网络前端/后端技术方面确实不是专家,也没有流利的知识。

【问题讨论】:

    标签: php websocket ratchet phpwebsocket


    【解决方案1】:

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

    没有。只需要一个循环。你的 sn-p 很好。您需要做的是调整Chat 类,使其接受来自用户输入的附加参数 - 房间 ID/名称。

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

    【讨论】:

    • 我曾为正在构建的应用程序考虑过这样的事情,但我现在的问题是如何阻止某人更改页面上的 javascript 以向他们当前不在的聊天室发送消息?
    • @DanHastings 也许您可以创建一个房间唯一的哈希令牌,这样当您发送“房间”时,该令牌必须匹配。或者您可以单独发送令牌作为房间 ID。
    • 加入房间时在服务器上保留房间 ID 并检查该 onMessage。 if(client room id 与 server room id 不同) { get out }
    【解决方案2】:

    好吧,我可能回答得有点晚了,但是我是怎么做到的。

    您应该在 Chat 类上实现 WampServerInterface 而不是 MessageComponentInterface(如果您还没有这样做的话)。

    如上所述,您的 sn-p 很好。

    这是我的聊天课程:

    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 上的 Ratchet 代码。

    我不知道你用什么做前端,我个人使用 autobahn.js 实例化与服务器的连接(使用棘轮)。

    【讨论】:

      猜你喜欢
      • 2018-12-18
      • 2012-05-14
      • 2018-03-10
      • 2017-07-30
      • 2011-11-18
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多