游戏中聊天推送消息

今天一下午,都在解决自己之前的bug,聊天推送消息推送不出去。

首先自己有一个误区,以为所有的玩家都是从同一个前端服务器进入游戏的;其次,自己没有真正理解pomelo推送消息的机制。造成了自己多次修改聊天系统。

先来说说前端服务器吧,玩家在进入游戏的时候,游戏服务器会自动分配一个前端的服务器,即connector 服务器,在配置文件中,肯定会有多个connector服务器的。所以玩家在进入房间的时候,channel.add( uid, sid );这里的sid 不会是一样的。

然后是,在推送消息的时候,如果是全频[所有的频道即所有的房间]推送消息的话,最好使用channel.pushMessage('onGlobalChat', msg); 如果是针对性的推送消息的话,则最好使用channelService.pushMessageByUids(method, msg, uids, opt,cb) 方法。


游戏中聊天推送消息_第1张图片

pushMessage方法使用方便,不需要获取角色的信息,直接就可以推送。

pushMessageByUids 方法,需要获取到接收玩家的uid [我这里是玩家的账户ID],

在这里还需要知道一个变量,channel.groups .这个变量保存着所有前端服务器里的所有在线玩家的uid.   groups结构如下:

{'connector-server-1' : [1,2,3,4], 'connector-server-2' : [5,6,7,8],,,,,}

推送消息的对象可能不在同一个前端服务器。

uid 的结构是 [ {uid : 1, sid : 'connector-server-1'}, {uid : 2, sid :'connector-server-2'},,,,,]

for( var i = 0; i < sendTarget.length; i++)

 { 

          for( var key in groups ){ for(var j = 0; j < groups[key].length; j++)

         { 

              if( sendTarget[i]['uid'] == groups[key][j]){ 

                sendTarget[i]['sid'] = key; } 

              } 

         } 

}

加入你已经获取到所有接收消息玩家的 uid 数组: sendTarget

sendTarget结构: [ { uid  : 1 },{ uid : 2 },,,,]

上面的过程就是将sid 加到sendTarget对象上。

这样才是完整的推送消息的过程。

今天就写到这里,继续阅读源码。。。

待续。。。

你可能感兴趣的:(游戏中聊天推送消息)