private Google.Protobuf.IMessage ReceiveMessage() { socket.Blocking = true; uint expected = headerSize; int n = 0; Byte[] headerBytes = new Byte[expected]; while (n < expected) { int m = socket.Receive(headerBytes, n, (int)expected - n, SocketFlags.None); //Console.WriteLine("HDR: n={0} m={1}", n, m); n += m; } Google.Protobuf.CodedInputStream headerStream = new Google.Protobuf.CodedInputStream(headerBytes); Message.Header header = new Message.Header(); header.MergeFrom(headerStream); expected = header.MessageSize; n = 0; Byte[] messageBytes = new Byte[expected]; while (n < expected) { int m = socket.Receive(messageBytes, n, (int)expected - n, SocketFlags.None); //Console.WriteLine("MSG: n={0} m={1}", n, m); n += m; } Google.Protobuf.CodedInputStream messageStream = new Google.Protobuf.CodedInputStream(messageBytes); Google.Protobuf.IMessage message = GetMessageBuilder(header.MessageType); message.MergeFrom(messageStream); return(message); }
public ErrorCode OnCs2DbQueryRanking(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.CS2DB_QueryRanking request = (Protos.CS2DB_QueryRanking)message; int @from = request.From; int count = request.Count; Protos.DB2CS_QueryRankingRet resp = ProtoCreator.R_CS2DB_QueryRanking(request.Opts.Pid); string str = $"SELECT id,uname,nickname,avatar,gender,last_login_time,ranking,exp FROM account_user ORDER BY ranking DESC LIMIT {@from}, {count}"; ErrorCode errorCode = DB.instance.accountDB.SqlExecQuery(str, dataReader => { while (dataReader.Read()) { Protos.DB2CS_RankingInfo rankingInfo = new Protos.DB2CS_RankingInfo(); rankingInfo.Ukey = dataReader.GetUInt32("id"); rankingInfo.Name = dataReader.GetString("nickname"); rankingInfo.Avatar = dataReader.GetString("avatar"); rankingInfo.Gender = dataReader.GetByte("gender"); rankingInfo.LastLoginTime = dataReader.GetInt64("last_login_time"); rankingInfo.Rank = dataReader.GetInt32("ranking"); rankingInfo.Exp = dataReader.GetInt32("exp"); resp.RankingInfos.Add(rankingInfo); } return(ErrorCode.Success); }); session.Send(resp); return(ErrorCode.Success); }
static StackObject *MergeFrom_2(ILIntepreter __intp, StackObject *__esp, IList <object> __mStack, CLRMethod __method, bool isNewObj) { ILRuntime.Runtime.Enviorment.AppDomain __domain = __intp.AppDomain; StackObject *ptr_of_this_method; StackObject *__ret = ILIntepreter.Minus(__esp, 4); ptr_of_this_method = ILIntepreter.Minus(__esp, 1); System.Int32 @length = ptr_of_this_method->Value; ptr_of_this_method = ILIntepreter.Minus(__esp, 2); System.Int32 @offset = ptr_of_this_method->Value; ptr_of_this_method = ILIntepreter.Minus(__esp, 3); System.Byte[] @data = (System.Byte[]) typeof(System.Byte[]).CheckCLRTypes(StackObject.ToObject(ptr_of_this_method, __domain, __mStack)); __intp.Free(ptr_of_this_method); ptr_of_this_method = ILIntepreter.Minus(__esp, 4); Google.Protobuf.IMessage @message = (Google.Protobuf.IMessage) typeof(Google.Protobuf.IMessage).CheckCLRTypes(StackObject.ToObject(ptr_of_this_method, __domain, __mStack)); __intp.Free(ptr_of_this_method); Google.Protobuf.MessageExtensions.MergeFrom(@message, @data, @offset, @length); return(__ret); }
private void MsgLoginByTokenRs(Google.Protobuf.IMessage msg) { Proto.LoginByTokenRs protoRs = msg as Proto.LoginByTokenRs; if (protoRs == null) { return; } switch (protoRs.ReturnCode) { case Proto.LoginByTokenRs.Types.ReturnCode.LgrcNotFoundAccount: UiMgr.GetInstance().CloseModalBox0(); UiMgr.GetInstance().OpenModalBox1("登录消息", $"[No:{protoRs.ReturnCode}]Token与账号不匹配...", Show); break; case Proto.LoginByTokenRs.Types.ReturnCode.LgrcTokenWrong: UiMgr.GetInstance().CloseModalBox0(); UiMgr.GetInstance().OpenModalBox1("登录消息", $"[No:{protoRs.ReturnCode}]Token不匹配...", Show); break; case Proto.LoginByTokenRs.Types.ReturnCode.LgrcUnkonwn: UiMgr.GetInstance().CloseModalBox0(); UiMgr.GetInstance().OpenModalBox1("登录消息", $"[No:{protoRs.ReturnCode}]未知错误...", Show); break; case Proto.LoginByTokenRs.Types.ReturnCode.LgrcOk: UiMgr.GetInstance().OpenModalBox0("登录消息", "登录成功,正在进入游戏..."); break; default: UiMgr.GetInstance().CloseModalBox0(); UiMgr.GetInstance().OpenModalBox1("登录消息", $"[No:{protoRs.ReturnCode}]未知错误...", Show); break; } }
/// <summary> /// 发送数据给服务器 /// </summary> public void Send(Google.Protobuf.IMessage msg) { if (IsConnected == false) { Debug.LogError("服务器未连接!"); return; } if (null == msg) { Debug.LogError("消息不能为空!"); return; } try { clientSocket.Send(ProtobufEncoding.Encode(msg)); } catch { IsConnected = false; clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); } }
public ErrorCode OnCs2LsGslost(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.CS2LS_GSLost gsLost = (Protos.CS2LS_GSLost)message; LS.instance.gsInfos.Remove(gsLost.Gsid); Logger.Log($"GS lost:{gsLost.Gsid},count:{LS.instance.gsInfos.Count}"); return(ErrorCode.Success); }
static int _m_SendToUser(RealStatePtr L) { try { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); BattleServer.User.BSUserMgr __cl_gen_to_be_invoked = (BattleServer.User.BSUserMgr)translator.FastGetCSObj(L, 1); { ulong gcNID = LuaAPI.lua_touint64(L, 2); Google.Protobuf.IMessage message = (Google.Protobuf.IMessage)translator.GetObject(L, 3, typeof(Google.Protobuf.IMessage)); bool __cl_gen_ret = __cl_gen_to_be_invoked.SendToUser(gcNID, message); LuaAPI.lua_pushboolean(L, __cl_gen_ret); return(1); } } catch (System.Exception __gen_e) { return(LuaAPI.luaL_error(L, "c# exception:" + __gen_e)); } }
public void RoleAppear(Google.Protobuf.IMessage msg) { if (!(msg is Proto.RoleAppear appear)) { UnityEngine.Debug.LogWarning($"parse RoleAppear error."); return; } foreach (var role in appear.Role) { var sn = role.Sn; if (!_players.ContainsKey(sn)) { RoleAppear appearObj = new RoleAppear(); appearObj.Parse(role); _players.Add(sn, appearObj); appearObj.Load3DObj(); UnityEngine.Debug.LogFormat($"sync player sn:{sn} world id:{_ref.GetId()}"); } else { _players[sn].Parse(role); } } }
// 客户端为了0GC需要消息池,服务端消息需要跨协程不需要消息池 public object GetInstance(ushort opcode) { //暂时先不用控制GC的方式 var type = this.GetTypeById(opcode); Google.Protobuf.IMessage message = typeMessages[opcode] as Google.Protobuf.IMessage; return(Activator.CreateInstance(type)); }
private static void OnGSAskPingRet(NetSessionBase session, Google.Protobuf.IMessage message, object[] args) { //long currTime = TimeUtils.utcTime; //Protos.G_AskPingRet askPingRet = ( Protos.G_AskPingRet )message; //long lag = ( long )( ( currTime - askPingRet.Stime ) * 0.5 ); //long timeDiff = askPingRet.Time + lag - currTime; //Logger.Log( $"cs ping ret, lag:{lag}, timediff:{timeDiff}" ); }
public ErrorCode OnGc2GsKeepAlive(NetSessionBase session, Google.Protobuf.IMessage message) { if (session is ClientSession gcSession) { gcSession.activeTime = TimeUtils.utcTime; } return(ErrorCode.Success); }
private void EncodeProto() { Google.Protobuf.IMessage im = (Google.Protobuf.IMessage)mProto; if (im != null) { mProtoBytes = Google.Protobuf.MessageExtensions.ToByteArray(im); } }
public ErrorCode OnBSAskPing(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.G_AskPing askPing = (Protos.G_AskPing)message; Protos.G_AskPingRet askPingRet = ProtoCreator.R_G_AskPing(askPing.Opts.Pid); askPingRet.Stime = askPing.Time; askPingRet.Time = TimeUtils.utcTime; session.Send(askPingRet); return(ErrorCode.Success); }
public ErrorCode OnCs2LsGsinfos(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.CS2LS_GSInfos gsInfos = (Protos.CS2LS_GSInfos)message; foreach (Protos.GSInfo gsInfo in gsInfos.GsInfo) { this.GCStateReportHandler(gsInfo); } return(ErrorCode.Success); }
public ErrorCode OnGc2BsAskLogin(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.GC2BS_AskLogin login = (Protos.GC2BS_AskLogin)message; Protos.BS2GC_LoginRet loginRet = ProtoCreator.R_GC2BS_AskLogin(login.Opts.Pid); //验证并登陆 BSUser user = BS.instance.userMgr.Online(login.SessionID, session.id); if (user != null) { ClientSession gcSession = ( ClientSession )session; //设置该Session为受信任的连接 gcSession.accredited = true; //把战场的初始状态下发到GC loginRet.PlayerID = user.gcNID; loginRet.RndSeed = user.battle.rndSeed; loginRet.FrameRate = user.battle.frameRate; loginRet.KeyframeStep = user.battle.keyframeStep; loginRet.SnapshotStep = user.battle.snapshotStep; loginRet.BattleTime = user.battle.battleTime; loginRet.MapID = user.battle.mapID; loginRet.CurFrame = user.battle.frame; int c1 = user.battle.battleEntry.users.Length; for (int i = 0; i < c1; i++) { var team = user.battle.battleEntry.users[i]; int c2 = team.Length; var teamInfo = new Protos.CS2BS_TeamInfo(); loginRet.TeamInfos.Add(teamInfo); for (int j = 0; j < c2; j++) { BSUser player = team[j]; Protos.CS2BS_PlayerInfo playerInfo = new Protos.CS2BS_PlayerInfo { GcNID = player.gcNID, ActorID = player.actorID, Nickname = player.nickname, Avatar = player.avatar, Gender = player.gender, Rank = player.rank, Exp = player.exp }; teamInfo.PlayerInfos.Add(playerInfo); } } loginRet.Result = Protos.Global.Types.ECommon.Success; session.Send(loginRet); } else { loginRet.Result = Protos.Global.Types.ECommon.Failed; session.Send(loginRet); session.Close(true, "client login failed"); } return(ErrorCode.Success); }
private void SendProtoBuf(int packet_id, Google.Protobuf.IMessage msg) { Packet pkt = PacketManager.Instance.AllocatePacket(); pkt.SetPacketID(packet_id); pkt.AddProtoBuf(msg); SendPacket(pkt); }
public bool SendPacket(Proto.MsgId msgId, Google.Protobuf.IMessage msg) { if (_state != NetworkState.Connected) { return(false); } int size = 0; if (msg != null) { size = msg.CalculateSize(); } if (msgId != Proto.MsgId.MiPing) { UnityEngine.Debug.Log("send msg. msg_id:" + msgId + " msg size:" + size); } var byteStream = new MemoryStream(); BinaryWriter bw = new BinaryWriter(byteStream); var totalLen = size + PacketHead.HeadSize; bw.Write((ushort)totalLen); // total size bw.Write((ushort)2); // head size bw.Write((ushort)msgId); if (msg != null) { Google.Protobuf.CodedOutputStream outStream = new Google.Protobuf.CodedOutputStream(byteStream); msg.WriteTo(outStream); outStream.Flush(); } Byte[] buf = byteStream.ToArray(); size = size + PacketHead.HeadSize; try { int pos = 0; while (size > 0) { int sent = _sock.Send(buf, pos, size, SocketFlags.None); size -= sent; pos += sent; } } catch (Exception ex) { UnityEngine.Debug.LogError(ex.Message); Disconnect(); return(false); } return(true); }
public bool SendToUser(ulong gcNID, Google.Protobuf.IMessage message) { BSUser user = this.GetUser(gcNID); if (user == null) { return(false); } return(user.Send(message)); }
public ErrorCode OnGc2BsFrameAction(NetSessionBase session, Google.Protobuf.IMessage message) { BSUser user = BS.instance.userMgr.GetUser(session.id); if (user != null) { BS.instance.battleMgr.HandleFrameAction(user.gcNID, user.battle, (Protos.GC2BS_FrameAction)message); } return(ErrorCode.Success); }
public ErrorCode OnGc2BsKeepAlive(NetSessionBase session, Google.Protobuf.IMessage message) { ClientSession gcSession = session as ClientSession; if (gcSession != null) { gcSession.activeTime = TimeUtils.utcTime; } return(ErrorCode.Success); }
private Message.Header.Types.MessageType GetMessageType(Google.Protobuf.IMessage message) { Type t = message.GetType(); if (t.Equals(typeof(Message.ConnectRequest))) { return(Message.Header.Types.MessageType.ConnectRequest); } if (t.Equals(typeof(Message.ConnectReply))) { return(Message.Header.Types.MessageType.ConnectReply); } if (t.Equals(typeof(Message.DisconnectRequest))) { return(Message.Header.Types.MessageType.DisconnectRequest); } if (t.Equals(typeof(Message.DisconnectReply))) { return(Message.Header.Types.MessageType.DisconnectReply); } if (t.Equals(typeof(Message.PutRequest))) { return(Message.Header.Types.MessageType.PutRequest); } if (t.Equals(typeof(Message.PutReply))) { return(Message.Header.Types.MessageType.PutReply); } if (t.Equals(typeof(Message.GetRequest))) { return(Message.Header.Types.MessageType.GetRequest); } if (t.Equals(typeof(Message.GetReply))) { return(Message.Header.Types.MessageType.GetReply); } if (t.Equals(typeof(Message.InvalidateRequest))) { return(Message.Header.Types.MessageType.InvalidateRequest); } if (t.Equals(typeof(Message.InvalidateReply))) { return(Message.Header.Types.MessageType.InvalidateReply); } if (t.Equals(typeof(Message.DestroyRequest))) { return(Message.Header.Types.MessageType.DestroyRequest); } if (t.Equals(typeof(Message.DestroyReply))) { return(Message.Header.Types.MessageType.DestroyReply); } return(Message.Header.Types.MessageType.UnspecifiedType); }
public ErrorCode OnGc2BsCommitSnapshot(NetSessionBase session, Google.Protobuf.IMessage message) { BSUser user = BS.instance.userMgr.GetUser(session.id); if (user != null) { Protos.GC2BS_CommitSnapshot request = (Protos.GC2BS_CommitSnapshot)message; BS.instance.battleMgr.HandleCommitSnapshot(user.battle, user.gcNID, request.Frame, request.Data); } return(ErrorCode.Success); }
public ErrorCode OnGc2BsEndBattle(NetSessionBase session, Google.Protobuf.IMessage message) { BSUser user = BS.instance.userMgr.GetUser(session.id); if (user != null) { Protos.GC2BS_EndBattle request = (Protos.GC2BS_EndBattle)message; BS.instance.battleMgr.HandleBattleEnd(user.battle, user.gcNID, request); } return(ErrorCode.Success); }
/// <summary> /// 广播消息 /// </summary> private void Broadcast(MatchUser[] users, Google.Protobuf.IMessage msg) { //预编码的消息广播不支持转发 foreach (MatchUser matchUser in users) { if (matchUser != null) { CS.instance.userMgr.GetUser(matchUser.id)?.Send(msg); } } }
/// <summary> /// 广播消息 /// </summary> public void Broadcast(BattleUser[] users, Google.Protobuf.IMessage msg) { //预编码的消息广播不支持转发 foreach (BattleUser user in users) { if (user != null) { CS.instance.userMgr.GetUser(user.id)?.Send(msg); } } }
/// <summary> /// LS通知CS有客户端登录成功 /// </summary> public ErrorCode OnLs2CsGclogin(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.LS2CS_GCLogin gcLogin = (Protos.LS2CS_GCLogin)message; CSUser user = CS.instance.userMgr.CreateUser(gcLogin); Protos.CS2LS_GCLoginRet gcLoginRet = ProtoCreator.R_LS2CS_GCLogin(gcLogin.Opts.Pid); gcLoginRet.Result = user != null ? Protos.CS2LS_GCLoginRet.Types.EResult.Success : Protos.CS2LS_GCLoginRet.Types.EResult.Failed; session.Send(gcLoginRet); return(ErrorCode.Success); }
public ErrorCode OnLs2DbExec(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.LS2DB_Exec exec = (Protos.LS2DB_Exec)message; Protos.DB2LS_ExecRet execRet = ProtoCreator.R_LS2DB_Exec(exec.Opts.Pid); ErrorCode errorCode = DB.instance.accountDB.SqlExecNonQuery(exec.Cmd, out int row, out uint id); execRet.Row = row; execRet.Id = id; execRet.Result = errorCode == ErrorCode.Success ? Protos.Global.Types.ECommon.Success : Protos.Global.Types.ECommon.Failed; session.Send(execRet); return(ErrorCode.Success); }
public void UnPacket(PacketHead head, byte[] byteArray, int offset, int length) { Proto.MsgId msgId = (Proto.MsgId)head.msg_id; if (!_msgHandler.ContainsKey(msgId)) { UnityEngine.Debug.LogWarning("!!!!! not found handler. recv packet msgId:" + head.msg_id); return; } Google.Protobuf.IMessage msg = _msgHandler[msgId](byteArray, offset, length); MessagePackDispatcher.GetInstance().Broadcasting(head.msg_id, msg); }
/// <summary> /// BS通知战场结束 /// </summary> public ErrorCode OnBs2CsBattleEnd(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.BS2CS_BattleEnd battleEnd = (Protos.BS2CS_BattleEnd)message; //评分 Dictionary <int, int> ratings = this.ComputeElorating(battleEnd.Infos); //数据库 Protos.CS2DB_UpdateRank dbRequest = ProtoCreator.Q_CS2DB_UpdateRank(); //通知客户端战场结束 Protos.CS2GC_BattleEnd gcBattleEnd = ProtoCreator.Q_CS2GC_BattleEnd(); foreach (var kv in battleEnd.Infos) { CSUser user = CS.instance.battleStaging.GetUser(kv.Key); Protos.BS2CS_BattleEndInfo info = kv.Value; gcBattleEnd.Result = (Protos.CS2GC_BattleEnd.Types.Result)info.Result; gcBattleEnd.GMoney = info.Result == Protos.BS2CS_BattleEndInfo.Types.Result.Win ? ( int )(0.01f * user.rank) : 0; gcBattleEnd.GDiamoned = 0; gcBattleEnd.GRank = ratings[info.Team]; gcBattleEnd.GExp = info.Result == Protos.BS2CS_BattleEndInfo.Types.Result.Win ? 10u : 0u; user.money += gcBattleEnd.GMoney; user.diamoned += gcBattleEnd.GDiamoned; user.rank += gcBattleEnd.GRank; user.exp += gcBattleEnd.GExp; gcBattleEnd.Money = user.rank; gcBattleEnd.Diamoned = user.diamoned; gcBattleEnd.Rank = user.rank; gcBattleEnd.Exp = user.exp; CS.instance.netSessionMgr.Send(user.gsSID, gcBattleEnd, null, Protos.MsgOpts.Types.TransTarget.Gc, user.gcNID); //数据库 Protos.CS2DB_Gain gain = new Protos.CS2DB_Gain(); gain.Ukey = user.ukey; gain.Money = user.money; gain.Diamoned = user.diamoned; gain.Rank = user.rank; gain.Exp = user.exp; dbRequest.Gains.Add(gain); } //数据库 CS.instance.netSessionMgr.Send(SessionType.ServerC2DB, dbRequest); //移除指定BS里指定战场里的所有玩家 CS.instance.battleStaging.Remove(session.logicID, battleEnd.Bid); //回应 Protos.CS2BS_BattleEndRet battleEndRet = ProtoCreator.R_BS2CS_BattleEnd(battleEnd.Opts.Pid); session.Send(battleEndRet); return(ErrorCode.Success); }
public ErrorCode OnGC2GSAskLogin(NetSessionBase session, Google.Protobuf.IMessage message) { Protos.GC2GS_AskLogin login = (Protos.GC2GS_AskLogin)message; Protos.GS2CS_GCAskLogin gcAskLogin = ProtoCreator.Q_GS2CS_GCAskLogin(); gcAskLogin.SessionID = login.SessionID; Logger.Log($"client:{gcAskLogin.SessionID} ask login"); //向CS请求客户端登陆 GS.instance.netSessionMgr.Send(SessionType.ServerG2CS, gcAskLogin, RPCEntry.Pop(OnCS2GSAskLoginRet, session.id, login)); return(ErrorCode.Success); }