PHP Ratchet Wamp在发布事件时向订阅服务器广播

PHP Ratchet Wamp在发布事件时向订阅服务器广播,php,ratchet,phpwebsocket,wamp-protocol,Php,Ratchet,Phpwebsocket,Wamp Protocol,我正在开发一个web应用程序,其中我需要以下场景的实时行为 应用程序将有两种类型的用户玩家和观众。玩家可以参加正在进行的比赛,而观众只能观看 游戏将由管理员用户初始化 观众基本上是能看到参加比赛的人名单的人。当然,这需要是实时的,即当玩家断开连接或新玩家加入游戏时,观众会看到实时列表 综上所述,考虑下面的例子 Spectator_1 joins Clan_101 Spectator_2 joins Clan_201 Player_1 joins Clan_101 // Need to bro

我正在开发一个web应用程序,其中我需要以下场景的实时行为

应用程序将有两种类型的用户
玩家
观众
。玩家可以参加正在进行的比赛,而观众只能观看

游戏将由管理员用户初始化

观众基本上是能看到参加比赛的人名单的人。当然,这需要是实时的,即当玩家断开连接或新玩家加入游戏时,观众会看到实时列表

综上所述,考虑下面的例子

Spectator_1 joins Clan_101 
Spectator_2 joins Clan_201

Player_1 joins Clan_101 // Need to broadcast this event to Spectator_1
Player_2 joins Clan_101 // Need to broadcast this event to Spectator_1
Player_1 disconnects Clan_101 // // Need to broadcast this event to Spectator_1

Player_11 joins Clan_201 // Need to broadcast this event to Spectator_2
Player_12 joins Clan_201 // // Need to broadcast this event to Spectator_2
考虑到正在进行的游戏是一个主题/频道(
Ratchet\Wamp\topic
),我需要向观众播放以下事件
player join
player left
,观众已订阅的游戏/主题

我在服务器端和客户端使用

下面是代码。到目前为止,当玩家加入/断开游戏时,我能够将信息发送到服务器(从客户端)。 但当玩家加入或断开连接时,我如何将此信息广播给观众(客户端)

player.html

<script src="scripts/autobahn.js" type="text/javascript"></script>
<script src="scripts/jquery-1.11.2.min.js" type="text/javascript"></script>
<script>
ab.connect(
    'ws://localhost:8080',
     function (session) {
         appSession = session;
         $('#btnJoinGame').on('click',function(){
         session.publish('joingame', ['data','GAME_ID']);
     });                   
 });
</script>
<script>
var conn = new ab.Session(
    'ws://localhost:8080', 
    function() {            
         conn.subscribe('spectator_GAME_ID', function(topic, data) {
            console.log(topic);
            console.log(data);
         });
     },
     function() {            
        console.warn('WebSocket connection closed');
     }    
 );  
 /* OR Using the legacy syntax */
 /*
     ab.connect(
         'ws://localhost:8080',
          function (session) {
              session.subscribe("t1011", function (topic, event) {
                  console.log(event);
              });
          }                       
      );
 */
</script>

首先,这个答案对你来说可能已经太晚了,尽管我会记录在案

在应用程序中建立多个频道后:观众\游戏\ ID

您希望能够看到谁在玩您正在观看的游戏。您使用WebSocket的原因是,您可以看到实时更改

首先,您必须了解主题都是不同的频道/游戏ID

一旦您意识到这一点,请使用ratchet自身示例页面上提供的代码

    $entryData = json_decode($entry, true);

    // If the lookup topic object isn't set there is no one to publish to
    if (!array_key_exists($entryData['category'], $this->subscribedTopics)) {
        return;
    }

    $topic = $this->subscribedTopics[$entryData['category']];

    // re-send the data to all the clients subscribed to that category
    $topic->broadcast($entryData);
在他们的示例中,他们在JSON字符串中使用类别,您可能会将其更改为gameId

一旦你有了这个位置,你就可以只向监听某个游戏ID的人发送数据


问题的第二部分是向他们发送更新,以及如何知道更新内容

最简单的方法是向正在发送的JSON obejct添加一个字符串

{
     "action": "join",
     "gameId": "123",                  //so that you know to which game to publish it
     "userIdThatJoined": "123456789",  //whatever other data you need
     "userNameThatJoined": "Foo Bar"
}
发送后,您应该在客户端接收它并检查操作,如果操作为“加入”,则将该用户的姓名添加到某个列表中。如果操作为“离开”,则从列表中删除该用户的姓名


您可以使用更新后调用的某些函数更新活动玩家列表中的显示,或使用angular的简单ng重复,然后将新值应用于它。

那么,问题到底是什么?首先,-1询问问题的方式(您在这里没有招聘人员)。其次,我看到您使用的是来自两个不同版本的Autobahn的两种不同语法(实现WAMPv1的版本和使用WAMPv2的版本)。另外,Ratchet中由WAMPServer类处理的PubSub模式仅与WAMPv1兼容,因此您应该只使用传统的Autobahnj。我会回来的,因为我也怀疑你实现订阅的方式。@whitelettersinblankpapers我尝试使用其他语法来订阅,结果也一样。请检查更新的问题
{
     "action": "join",
     "gameId": "123",                  //so that you know to which game to publish it
     "userIdThatJoined": "123456789",  //whatever other data you need
     "userNameThatJoined": "Foo Bar"
}