Pomelo游戏服务器端开发系列(8)--消息类型
博客专区 > nextzeus 的博客 > 博客详情
Pomelo游戏服务器端开发系列(8)--消息类型
nextzeus 发表于5个月前
Pomelo游戏服务器端开发系列(8)--消息类型
  • 发表于 5个月前
  • 阅读 18
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

#消息类型种类

pomelo中有四种消息类型:request, response, notify, push

request ,response

一般的web框架,例如express,短连接 两种消息类型request, response,有求必应。

notify

按理说长连接是不需要等待服务器端响应,也就是说客户端client可以使用notify, 不需要注册callback

lordOfPomelo notify使用

//client
$leaveTeam.on('click', function() {
    console.log('click leaveTeam ...');
    pomelo.notify("area.teamHandler.leaveTeam", {
        playerId: pomelo.playerId,
        teamId: pomelo.teamId
    });
    console.log('leaveTeam ~ pomelo.teamId = ', pomelo.teamId);
    $teamMenu.hide();
});


//server
Handler.prototype.leaveTeam = function(msg, session, next) {
  var area = session.area;
  var playerId = session.get('playerId');
  var player = area.getPlayer(playerId);

  if(!player) {
    logger.warn('The request(leaveTeam) is illegal, the player is null: msg = %j.', msg);
    next();
    return;
  }

  utils.myPrint('playerId, IsInTeamInstance = ', playerId, player.isInTeamInstance);
  if (player.isInTeamInstance) {
    next();
    return;
  }

  var result = consts.TEAM.FAILED;

  utils.myPrint("player.teamId = ", player.teamId);
  utils.myPrint("typeof player.teamId = ", typeof player.teamId);

  utils.myPrint("msg.teamId = ", msg.teamId);
  utils.myPrint("typeof msg.teamId = ", typeof msg.teamId);

  if(player.teamId <= consts.TEAM.TEAM_ID_NONE || player.teamId !== msg.teamId) {
    logger.warn('The request(leaveTeam) is illegal, the teamId is wrong: msg = %j.', msg);
    next();
    return;
  }

  var args = {playerId: playerId, teamId: player.teamId};
  this.app.rpc.manager.teamRemote.leaveTeamById(session, args,
    function(err, ret) {
      result = ret.result;
      utils.myPrint("1 ~ result = ", result);
      if(result === consts.TEAM.OK && !player.leaveTeam()) {
        result = consts.TEAM.FAILED;
      }
      if (result === consts.TEAM.OK) {
        var route = 'onTeamMemberStatusChange';
        if(player.isCaptain) {
          route = 'onTeamCaptainStatusChange';
          player.isCaptain = consts.TEAM.NO;
        }
        var ignoreList = {};
        messageService.pushMessageByAOI(area,
          {
            route: route,
            playerId: playerId,
            teamId: player.teamId,
            isCaptain: player.isCaptain,
            teamName: consts.TEAM.DEFAULT_NAME
          },
          {x: player.x, y: player.y}, ignoreList);
      }

      utils.myPrint("teamId = ", player.teamId);
    });

  next();
};

注意

需要注意的是,虽然说不需要等待服务器端的响应, 但是服务器一定要next() 只不过不需要返回任何信息给client. 如果不执行next回调,可能会导致进程中存在多个回调函数没有执行,rpc回调超市,这也可能是内存增长的一个点。

push

这个消息类型 是服务器端主动往客户端推送消息, 不需要客户端请求。只要与客户端的连接没有断开,就可以push消息过去。 推送消息的API : channel.pushMessage, channelService.pushMessageByUids, channelService.broadcast 这三个。

标签: Pomelo 消息类型
共有 人打赏支持
粉丝 9
博文 12
码字总数 4743
×
nextzeus
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: