public async Task SendPacket(MOMsg packet) { if (packet.ActionId == 100000) { //登录绑定 _user = GrainFactory.GetGrain <IUserGrain>(packet.UserId); await _globalWorld.PlayerEnterGlobalWorld(_user); if (_curRoom != null) { await _curRoom.Reconnect(_user); //通知上线 var message = new MOMsg() { ActionId = 100, Content = new S2C100() { UserId = _user.GetPrimaryKeyLong(), IsOnline = true }.ToByteString() }; await _curRoom.RoomNotify(message); } await _user.Notify(packet.ParseResult()); } else { if (_user == null) { await _user.Notify(packet.ParseResult(MOErrorType.Hidden, "用户未登录")); return; } if (packet.ActionId == 100001) { var req = C2S100001.Parser.ParseFrom(packet.Content); if (_curRoom == null) { _curRoom = GrainFactory.GetGrain <IRoomGrain>(req.RoomId); } await _curRoom.PlayerEnterRoom(_user); } else { if (_curRoom == null) { await _user.Notify(packet.ParseResult(MOErrorType.Hidden, "房间信息不存在")); return; } switch (packet.ActionId) { case 100005: { await _curRoom.PlayerLeaveRoom(_user); _curRoom = null; } break; case 100007: { var req = C2S100007.Parser.ParseFrom(packet.Content); await _curRoom.PlayerSendMsg(_user, req.Content); } break; case 100009: { var req = C2S100009.Parser.ParseFrom(packet.Content); await _curRoom.PlayerCommand(_user, req.Commands.ToList()); } break; } } } }
public async Task DispatchIncomingPacket(MOMsg packet) { try { //System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); //watch.Restart(); //md5签名验证 var sign = packet.Sign; packet.Sign = string.Empty; var data = packet.ToByteString(); if (CryptoHelper.MD5_Encrypt($"{data}{_md5Key}").ToLower() != sign.ToLower()) { await DispatchOutcomingPacket(packet.ParseResult(MOErrorType.Hidden, "签名验证失败")); await Close(); return; } //同步初始化 if (!_IsInit) { _tokenGrain = _client.GetGrain <ITokenGrain>(packet.UserId); var tokenInfo = _tokenGrain.GetToken().Result; if (tokenInfo.Token != packet.Token || tokenInfo.LastTime.AddSeconds(GameConstants.TOKENEXPIRE) < DateTime.Now) { await DispatchOutcomingPacket(packet.ParseResult(MOErrorType.Hidden, "Token验证失败")); await Close(); return; } _userId = packet.UserId; //_token = tokenInfo.Token; _packetObserver = new OutcomingPacketObserver(this); _router = _client.GetGrain <IPacketRouterGrain>(_userId); _user = _client.GetGrain <IUserGrain>(_userId); _packetObserverRef = _client.CreateObjectReference <IPacketObserver>(_packetObserver).Result; _user.BindPacketObserver(_packetObserverRef).Wait(); _IsInit = true; } else { //if (_userId != packet.UserId || _token != packet.Token) //{ // await DispatchOutcomingPacket(packet.ParseResult(MOErrorType.Hidden, "Token验证失败")); // await Close(); // return; //} var tokenInfo = _tokenGrain.GetToken().Result; if (tokenInfo.Token != packet.Token || tokenInfo.LastTime.AddSeconds(GameConstants.TOKENEXPIRE) < DateTime.Now) { await DispatchOutcomingPacket(packet.ParseResult(MOErrorType.Hidden, "Token验证失败")); await Close(); return; } } //心跳包 if (packet.ActionId == 1) { await _tokenGrain.RefreshTokenTime(); await DispatchOutcomingPacket(packet.ParseResult()); return; } await _router.SendPacket(packet); //watch.Stop(); //Console.WriteLine($"{packet.UserId} {watch.ElapsedMilliseconds}ms"); } catch (Exception ex) { _logger.LogError( $"DispatchIncomingPacket异常:\n" + $"{ex.Message}\n" + $"{ex.StackTrace}\n" + $"{JsonConvert.SerializeObject(packet)}"); } }