Pomelo游戏服务器端开发系列(8)--消息类型

#消息类型种类

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 这三个。

转载于:https://my.oschina.net/nextzeus/blog/1204620

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值