使用Ratchet创建/管理私人房间?

时间:2014-12-26 11:48:39

标签: php websocket ratchet phpwebsocket

我正在制作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开发人员,并且真的没有专家或对网络前端/后端技术有流畅的了解。我做网络编程作为一种爱好,我尽我所能进行所有搜索和研究,因此请不要介意我的任何问题听起来都很愚蠢。

谢谢,

2 个答案:

答案 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来实例化与服务器的连接(使用棘轮)。