public bool TryDecodePackage(HttpListenerContext context, out RequestPackage package) { int statuscode; if (TryDecodePackage(context.Request, out package, out statuscode)) { return true; } return false; }
/// <summary> /// Decode request package /// </summary> /// <param name="e"></param> /// <param name="package"></param> /// <returns></returns> public bool TryDecodePackage(ConnectionEventArgs e, out RequestPackage package) { package = null; string paramStr = Encoding.ASCII.GetString(e.Data); int index = paramStr.IndexOf("?d=", StringComparison.CurrentCultureIgnoreCase); string routeName = string.Empty; if (index != -1) { if (paramStr.StartsWith("route:", StringComparison.CurrentCultureIgnoreCase)) { routeName = paramStr.Substring(6, index - 6); } paramStr = paramStr.Substring(index, paramStr.Length - index); paramStr = HttpUtility.ParseQueryString(paramStr)["d"]; } var nvc = HttpUtility.ParseQueryString(paramStr); var param = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); foreach (var key in nvc.AllKeys) { param[key] = nvc[key]; } if (param.ContainsKey("route")) { routeName = param["route"]; } //if (!param.ContainsKey("ssid")) { Interlocked.Increment(ref errorDropNum); return; } if (!param.ContainsKey("actionid")) { return false; } if (!param.ContainsKey("msgid")) { return false; } //sessionId of proxy server Guid proxySid; if (!param.ContainsKey("ssid") || !Guid.TryParse(param["ssid"], out proxySid)) { proxySid = Guid.Empty; } int actionid; if (!int.TryParse(param["actionid"], out actionid)) { return false; } int msgid; if (!int.TryParse(param["msgid"], out msgid)) { return false; } int userId; int.TryParse(param["uid"], out userId); string sessionId = param.ContainsKey("sid") ? param["sid"] : ""; package = new RequestPackage(msgid, sessionId, actionid, userId) { ProxySid = proxySid, IsProxyRequest = param.ContainsKey("isproxy"), RouteName = routeName, IsUrlParam = true, UrlParam = paramStr }; return true; }
public bool TryDecodePackage(HttpContext context, out RequestPackage package) { package = null; MessagePack head = null; byte[] content = new byte[0]; var bytes = GetRequestStream(context.Request.InputStream); head = ReadMessageHead(bytes, out content); if (head == null) { return false; } package = new RequestPackage(head.MsgId, head.SessionId, head.ActionId, head.UserId) { Message = content }; return true; }
public bool TryDecodePackage(ConnectionEventArgs e, out RequestPackage package) { //这里解出头部信息根据ActionId来分发请求到相应的Action子类 package = null; byte[] content; MessagePack head = ReadMessageHead(e.Data, out content); if (head == null) { return false; } package = new RequestPackage(head.MsgId, head.SessionId, head.ActionId, head.UserId) { Message = content }; return true; }
public bool TryDecodePackage(HttpListenerRequest request, out RequestPackage package, out int statusCode) { statusCode = 200; package = null; byte[] content; var bytes = GetRequestStream(request.InputStream); MessagePack head = ReadMessageHead(bytes, out content); if (head == null) { return false; } package = new RequestPackage(head.MsgId, head.SessionId, head.ActionId, head.UserId) { Message = content }; return true; }
private static GameSession GetSession(HttpContext context, RequestPackage package) { GameSession session; if (package.ProxySid != Guid.Empty) { session = GameSession.Get(package.ProxySid) ?? GameSession.CreateNew(package.ProxySid, context.Request); session.ProxySid = package.ProxySid; } else { session = GameSession.Get(package.SessionId) ?? GameSession.CreateNew(Guid.NewGuid(), context.Request); } return session; }
public bool TryDecodePackage(ConnectionEventArgs e, out RequestPackage package) { //这里解出头部信息根据ActionId来分发请求到相应的Action子类 package = null; byte[] content; //todo test 1001 action //MessagePack packageHead = new MessagePack { MsgId = 1, ActionId = 1001, SessionId = "", UserId = 1380001 }; //byte[] headBytes = ProtoBufUtils.Serialize(packageHead); //byte[] contentBytes = ProtoBufUtils.Serialize(new Request1001Pack() { PageIndex = 1, PageSize = 20 }); //e.Data = BufferUtils.MergeBytes(BufferUtils.AppendHeadBytes(headBytes), contentBytes); MessagePack head = ReadMessageHead(e.Data, out content); if (head == null) { return false; } package = new RequestPackage(head.MsgId, head.SessionId, head.ActionId, head.UserId) { Message = content }; return true; }
/// <summary> /// /// </summary> /// <param name="request"></param> /// <param name="package"></param> /// <param name="statusCode"></param> /// <returns></returns> public bool TryDecodePackage(HttpListenerRequest request, out RequestPackage package, out int statusCode) { statusCode = 200; package = null; string data = ""; if (Environment.OSVersion.Platform == PlatformID.Unix) { if (String.Compare(request.HttpMethod, "get", StringComparison.OrdinalIgnoreCase) == 0) { data = request.RawUrl.Substring(8); data = HttpUtility.UrlDecode(data); } } else { data = request.QueryString["d"]; } if (string.IsNullOrEmpty(data)) { using (var reader = new StreamReader(request.InputStream, request.ContentEncoding)) { data = reader.ReadToEnd(); data = HttpUtility.ParseQueryString(data)["d"]; } } //if data is null ping command if (string.IsNullOrEmpty(data)) { statusCode = (int)HttpStatusCode.OK; return(false); } int statuscode = 0; Dictionary <string, string> param = new Dictionary <string, string>(StringComparer.InvariantCultureIgnoreCase); if (data != null) { var nvc = HttpUtility.ParseQueryString(data); foreach (var key in nvc.AllKeys) { param[key] = nvc[key]; } } statuscode = CheckHttpParam(param); if (statuscode != (int)HttpStatusCode.OK) { statusCode = statuscode; return(false); } //sessionId of proxy server Guid proxySid; if (!param.ContainsKey("ssid") || !Guid.TryParse(param["ssid"], out proxySid)) { proxySid = Guid.Empty; } int actionid; if (!int.TryParse(param["actionid"], out actionid)) { return(false); } int msgid; if (!int.TryParse(param["msgid"], out msgid)) { return(false); } int userId; int.TryParse(param["uid"], out userId); string routeName = string.Empty; if (param.ContainsKey("route")) { routeName = param["route"]; } string sessionId = param.ContainsKey("sid") ? param["sid"] : ""; string proxyId = param.ContainsKey("proxyId") ? param["proxyId"] : ""; package = new RequestPackage(msgid, sessionId, actionid, userId) { ProxySid = proxySid, ProxyId = proxyId, IsProxyRequest = param.ContainsKey("isproxy"), RouteName = routeName, IsUrlParam = true, UrlParam = data }; return(true); }
public ActionGetter GetActionGetter(RequestPackage package) { // 可以实现自定的ActionGetter子类 return new ActionGetter(package); }
/// <summary> /// /// </summary> /// <param name="package"></param> /// <param name="session"></param> /// <returns></returns> public virtual ActionGetter GetActionGetter(RequestPackage package, GameSession session) { return new HttpGet(package, session); }
/// <summary> /// /// </summary> /// <param name="actionId"></param> /// <param name="sessionList"></param> /// <param name="package"></param> /// <param name="complateHandle"></param> /// <param name="onlineInterval"></param> /// <returns></returns> public static async System.Threading.Tasks.Task BroadcastAction(int actionId, List <GameSession> sessionList, RequestPackage package, Action <GameSession, SocketAsyncResult> complateHandle, int onlineInterval) { try { if (sessionList.Count == 0) { return; } if (sessionList.Exists(s => Equals(s, null))) { throw new ArgumentNullException("Session is a null value."); } IActionDispatcher actionDispatcher = new ScutActionDispatcher(); byte[] sendBuffer = GetActionResponse(actionDispatcher, actionId, sessionList[0], package); foreach (var session in sessionList) { GameSession temp = session; try { if (onlineInterval <= 0 || session.LastActivityTime > MathUtils.Now.AddSeconds(-onlineInterval)) { await session.SendAsync(package.OpCode, sendBuffer, 0, sendBuffer.Length, result => { if (complateHandle != null) { complateHandle(temp, result); } }); } else { if (complateHandle != null) { complateHandle(temp, new SocketAsyncResult(sendBuffer) { Result = ResultCode.Close }); } } } catch (Exception ex) { if (complateHandle != null) { complateHandle(temp, new SocketAsyncResult(sendBuffer) { Result = ResultCode.Error, Error = ex }); } TraceLog.WriteError("BroadcastAction action:{0} userId:{1} error:{2}", actionId, session.UserId, ex); } } } catch (Exception ex) { TraceLog.WriteError("BroadcastAction action:{0} error:{1}", actionId, ex); } }
private async System.Threading.Tasks.Task ProcessPackage(RequestPackage package, GameSession session) { if (package == null) return; try { ActionGetter actionGetter; byte[] data = new byte[0]; if (!string.IsNullOrEmpty(package.RouteName)) { actionGetter = ActionDispatcher.GetActionGetter(package, session); if (CheckRemote(package.RouteName, actionGetter)) { MessageStructure response = new MessageStructure(); OnCallRemote(package.RouteName, actionGetter, response); data = response.PopBuffer(); } else { return; } } else { SocketGameResponse response = new SocketGameResponse(); response.WriteErrorCallback += ActionDispatcher.ResponseError; actionGetter = ActionDispatcher.GetActionGetter(package, session); DoAction(actionGetter, response); data = response.ReadByte(); } try { if (session != null && data.Length > 0) { await session.SendAsync(actionGetter.OpCode, data, 0, data.Length, OnSendCompleted); } } catch (Exception ex) { TraceLog.WriteError("PostSend error:{0}", ex); } } catch (Exception ex) { TraceLog.WriteError("Task error:{0}", ex); } finally { if (session != null) session.ExitSession(); } }
public virtual bool TryDecodePackage(HttpContext context, out RequestPackage package) { package = null; if (context == null) { return false; } var d = context.Request["d"] ?? ""; var nvc = HttpUtility.ParseQueryString(d); Dictionary<string, string> param = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); foreach (var key in nvc.AllKeys) { param[key] = nvc[key]; } string sessionId = param.ContainsKey("sid") ? param["sid"] : ""; int msgId = (param.ContainsKey("MsgId") ? param["MsgId"] : "0").ToInt(); int actionId = (param.ContainsKey("actionId") ? param["actionId"] : "0").ToInt(); int userId = (param.ContainsKey("uid") ? param["uid"] : "0").ToInt(); var session = GameSession.Get(sessionId) ?? GameSession.CreateNew(Guid.NewGuid(), context.Request); package = new RequestPackage(msgId, sessionId, actionId, userId) { IsUrlParam = true, UrlParam = d, Session = session }; return true; }
/// <summary> /// /// </summary> /// <param name="package"></param> /// <param name="session"></param> /// <returns></returns> public virtual ActionGetter GetActionGetter(RequestPackage package, GameSession session) { return(new HttpGet(package, session)); }
/// <summary> /// /// </summary> /// <param name="package"></param> /// <param name="session"></param> protected virtual void BuildHearbeatPackage(RequestPackage package, GameSession session) { }
public override ActionGetter GetActionGetter(RequestPackage package, GameSession session) { // 可以实现自定的ActionGetter子类 return new HttpGet(package, session) { OpCode = OpCode.Text }; }
/// <summary> /// /// </summary> /// <param name="package"></param> /// <param name="session"></param> public HttpGet(RequestPackage package, GameSession session) : base(package, session) { _paramString = package.UrlParam ?? ""; InitData(_paramString); }
/// <summary> /// /// </summary> /// <param name="session"></param> /// <param name="actionId"></param> /// <param name="package"></param> /// <param name="complateHandle"></param> /// <param name="onlineInterval"></param> /// <returns></returns> public static async System.Threading.Tasks.Task SendAction(GameSession session, int actionId, RequestPackage package, Action <GameSession, SocketAsyncResult> complateHandle, int onlineInterval) { IActionDispatcher actionDispatcher = new ScutActionDispatcher(); GameSession temp = session; byte[] sendBuffer = null; try { sendBuffer = GetActionResponse(actionDispatcher, actionId, session, package); if ((onlineInterval <= 0 || session.LastActivityTime > MathUtils.Now.AddSeconds(-onlineInterval))) { await session.SendAsync(package.OpCode, sendBuffer, 0, sendBuffer.Length, result => { if (complateHandle != null) { complateHandle(temp, result); } }); } else { if (complateHandle != null) { complateHandle(temp, new SocketAsyncResult(sendBuffer) { Result = ResultCode.Close }); } } } catch (Exception ex) { if (complateHandle != null) { complateHandle(temp, new SocketAsyncResult(sendBuffer) { Result = ResultCode.Error, Error = ex }); } TraceLog.WriteError("SendToClient action:{0} userId:{1} error:{2}", actionId, session.UserId, ex); } }
private static GameSession GetSession(System.Web.HttpContext context, RequestPackage package) { GameSession session; if (package.ProxySid != Guid.Empty) { session = GameSession.Get(package.ProxySid) ?? GameSession.CreateNew(package.ProxySid, context.Request); session.ProxySid = package.ProxySid; } else { session = (string.IsNullOrEmpty(package.SessionId) ? GameSession.GetSessionByCookie(context.Request) : GameSession.Get(package.SessionId)) ?? GameSession.CreateNew(Guid.NewGuid(), context.Request); } return session; }
public bool TryDecodePackage(HttpListenerRequest request, out RequestPackage package, out int statusCode) { statusCode = 200; package = null; string RawUrl = request.RawUrl; bool NetPayCb = RawUrl.IndexOf("Pay")>0; if(NetPayCb) // Pay for 3rd { string data = ""; if (String.Compare(request.HttpMethod, "get", StringComparison.OrdinalIgnoreCase) == 0 || String.Compare(request.HttpMethod, "post", StringComparison.OrdinalIgnoreCase) == 0) { data = request.RawUrl.Substring("Service.aspx".Length+1); data = HttpUtility.UrlDecode(data); } int MsgId = -1; string SessionId = ""; int ActionId = -1; int UserId = -1; string content = ""; package = null; content = data; if(data.Contains("Pay360")) { ActionId = 2500; content = data.Substring(data.IndexOf('?') + 1); } if(data.Contains("GuccangGuard")) { ActionId = 4000; content = "guccang"; } if(data.Contains("BaiDu")) { //if(String.Compare(request.HttpMethod, "get", StringComparison.OrdinalIgnoreCase) == 0) //{ // Console.WriteLine("BaiDu this is get method" + request.RemoteEndPoint); //} //if (String.Compare(request.HttpMethod, "post", StringComparison.OrdinalIgnoreCase) == 0) // { // Console.WriteLine("BaiDu this is post method" + request.RemoteEndPoint); // } ActionId = 2502; content = ""; using (var br = new System.IO.BinaryReader(request.InputStream)) { int contentLenght = (int)request.ContentLength64; content = System.Text.Encoding.UTF8.GetString(br.ReadBytes(contentLenght)); } } if(ActionId<0) { return false; } package = new RequestPackage(MsgId, SessionId, ActionId, UserId) { Message = content }; return true; } else if(RawUrl.IndexOf("webBackOffice")>0) { // web back-office using (var br = new System.IO.BinaryReader(request.InputStream)) { int contentLenght = (int)request.ContentLength64; string content = System.Text.Encoding.UTF8.GetString(br.ReadBytes(contentLenght)); package = new RequestPackage(0, "", 4000, 0) { Message = content }; System.Console.WriteLine(content); } return true; } else // GameServer Logic { byte[] content; var bytes = GetRequestStream(request.InputStream); MessagePack head = ReadMessageHead(bytes, out content); if (head == null) { return false; } package = new RequestPackage(head.MsgId, head.SessionId, head.ActionId, head.UserId) { Message = content }; return true; } }
public virtual bool TryDecodePackage(HttpListenerContext context, out RequestPackage package) { package = null; HttpListenerRequest request = context.Request; HttpListenerResponse response = context.Response; string data = ""; if (Environment.OSVersion.Platform == PlatformID.Unix) { if (string.Compare(request.HttpMethod, "get", true) == 0) { data = request.RawUrl.Substring(8); data = HttpUtility.UrlDecode(data); } } else { data = request.QueryString["d"]; } if (string.IsNullOrEmpty(data)) { using (var reader = new StreamReader(request.InputStream, request.ContentEncoding)) { data = reader.ReadToEnd(); data = HttpUtility.ParseQueryString(data)["d"]; } } int statuscode = 0; Dictionary<string, string> param = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); if (data != null) { var nvc = HttpUtility.ParseQueryString(data); foreach (var key in nvc.AllKeys) { param[key] = nvc[key]; } } statuscode = CheckHttpParam(param); if (statuscode != (int)HttpStatusCode.OK) { response.StatusCode = statuscode; response.Close(); return false; } //sessionId of proxy server Guid proxySid; if (!param.ContainsKey("ssid") || !Guid.TryParse(param["ssid"], out proxySid)) { proxySid = Guid.Empty; } int actionid; if (!int.TryParse(param["actionid"], out actionid)) { return false; } int msgid; if (!int.TryParse(param["msgid"], out msgid)) { return false; } int userId; int.TryParse(param["uid"], out userId); string routeName = string.Empty; if (param.ContainsKey("route")) { routeName = param["route"]; } string sessionId = param.ContainsKey("sid") ? param["sid"] : ""; package = new RequestPackage(msgid, sessionId, actionid, userId) { ProxySid = proxySid, IsProxyRequest = param.ContainsKey("isproxy"), RouteName = routeName, IsUrlParam = true, UrlParam = data }; return true; }
private void ProcessPackage(RequestPackage package) { if (package == null) return; var session = package.Session; try { byte[] data = new byte[0]; if (!string.IsNullOrEmpty(package.RouteName)) { ActionGetter actionGetter = ActionDispatcher.GetActionGetter(package); if (CheckRemote(package.RouteName, actionGetter)) { MessageStructure response = new MessageStructure(); OnCallRemote(package.RouteName, actionGetter, response); data = response.PopBuffer(); } } else { SocketGameResponse response = new SocketGameResponse(); response.WriteErrorCallback += ActionDispatcher.ResponseError; ActionGetter actionGetter = ActionDispatcher.GetActionGetter(package); DoAction(actionGetter, response); data = response.ReadByte(); } try { if (data.Length > 0) { session.SendAsync(data, 0, data.Length); } } catch (Exception ex) { TraceLog.WriteError("PostSend异常{0}", ex); } } catch (Exception ex) { TraceLog.WriteError("Task异常{0}", ex); } finally { session.ExitSession(); } }
public virtual ActionGetter GetActionGetter(RequestPackage package) { return new HttpGet(package); }
/// <summary> /// Decode request package /// </summary> /// <param name="e"></param> /// <param name="package"></param> /// <returns></returns> public virtual bool TryDecodePackage(ConnectionEventArgs e, out RequestPackage package) { var packageReader = new PackageReader(e.Data, Encoding.UTF8); if (TryBuildPackage(packageReader, out package)) { package.OpCode = e.Meaage.OpCode; package.CommandMessage = e.Socket.IsWebSocket && e.Meaage.OpCode == OpCode.Text ? e.Meaage.Message : null; return true; } return false; }
private GameSession GetSession(ConnectionEventArgs e, RequestPackage package) { //使用代理分发器时,每个ssid建立一个游服Serssion GameSession session; if (package.ProxySid != Guid.Empty) { session = GameSession.Get(package.ProxySid) ?? (package.IsProxyRequest ? GameSession.Get(e.Socket.HashCode) : GameSession.CreateNew(package.ProxySid, e.Socket, socketListener)); if (session != null) { session.ProxySid = package.ProxySid; } } else { session = GameSession.Get(package.SessionId) ?? GameSession.Get(e.Socket.HashCode); } if (session == null) { session = GameSession.CreateNew(package.ProxySid, e.Socket, socketListener); } if ((!session.Connected || !Equals(session.RemoteAddress, e.Socket.RemoteEndPoint.ToString()))) { GameSession.Recover(session, e.Socket.HashCode, e.Socket, socketListener); } return session; }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="package"></param> /// <returns></returns> public virtual bool TryDecodePackage(HttpListenerContext context, out RequestPackage package) { HttpListenerRequest request = context.Request; HttpListenerResponse response = context.Response; int statuscode; if (TryDecodePackage(request, out package, out statuscode)) { return true; } response.StatusCode = statuscode; response.Close(); return false; }
/// <summary> /// Response hearbeat stream. /// </summary> /// <param name="package"></param> /// <param name="session"></param> protected void ResponseHearbeat(RequestPackage package, GameSession session) { try { MessageStructure response = new MessageStructure(); response.WriteBuffer(new MessageHead(package.MsgId, package.ActionId, 0)); var data = response.PopBuffer(); if (session != null && data.Length > 0) { session.SendAsync(OpCode.Binary, data, 0, data.Length, OnSendCompleted).Wait(); } } catch (Exception ex) { TraceLog.WriteError("Post Heartbeat error:{0}", ex); } }
/// <summary> /// /// </summary> /// <param name="actionDispatcher"></param> /// <param name="actionId"></param> /// <param name="session"></param> /// <param name="package"></param> /// <returns></returns> public static byte[] GetActionResponse(IActionDispatcher actionDispatcher, int actionId, GameSession session, RequestPackage package) { package.Bind(session); var actionGetter = new HttpGet(package, session); return(ProcessActionResponse(actionDispatcher, actionId, actionGetter)); }
/// <summary> /// /// </summary> /// <param name="request"></param> /// <param name="package"></param> /// <param name="statusCode"></param> /// <returns></returns> public bool TryDecodePackage(HttpListenerRequest request, out RequestPackage package, out int statusCode) { statusCode = (int)HttpStatusCode.OK; string data = ""; if (Environment.OSVersion.Platform == PlatformID.Unix) { //The RawUrl Get is exist "/xxx.aspx?d=" char on the platform of mono. int index; if (String.Compare(request.HttpMethod, "get", StringComparison.OrdinalIgnoreCase) == 0 && (index = request.RawUrl.IndexOf("?d=", StringComparison.OrdinalIgnoreCase)) != -1) { data = request.RawUrl.Substring(index + 3); data = HttpUtility.UrlDecode(data); } else { data = request.RawUrl; } } else { data = request.QueryString["d"]; } var packageReader = new PackageReader(data, request.InputStream, request.ContentEncoding); return TryBuildPackage(packageReader, out package); }
/// <summary> /// /// </summary> /// <param name="package"></param> /// <param name="session"></param> /// <returns></returns> protected virtual bool CheckSpecialPackge(RequestPackage package, GameSession session) { //处理特殊包 if (package.ActionId == ((int)ActionEnum.Interrupt)) { //Proxy server notifly interrupt connect ops OnDisconnected(session); if (session != null && (session.ProxySid == Guid.Empty || GameSession.Count > 1)) { //保留代理服连接 session.Close(); session.ProxySid = Guid.Empty; } return true; } if (package.ActionId == ((int)ActionEnum.Heartbeat)) { if (session != null) { // 客户端tcp心跳包 session.Refresh(); OnHeartbeat(session); BuildHearbeatPackage(package, session); session.ExitSession(); } return true; } return false; }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="package"></param> /// <returns></returns> public virtual bool TryDecodePackage(HttpContext context, out RequestPackage package) { package = null; if (context == null) { return false; } var data = context.Request["d"] ?? ""; var packageReader = new PackageReader(data, context.Request.InputStream, context.Request.ContentEncoding); return TryBuildPackage(packageReader, out package); }
private bool CheckSpecialPackge(RequestPackage package, GameSession session) { //处理特殊包 if (package.ActionId == ((int)ActionEnum.Interrupt)) { //Proxy server notifly interrupt connect ops OnDisconnected(session); if (session != null && (session.ProxySid == Guid.Empty || GameSession.Count > 1)) { //保留代理服连接 session.Close(); session.ProxySid = Guid.Empty; } return true; } if (package.ActionId == ((int)ActionEnum.Heartbeat)) { // 客户端tcp心跳包 session.Refresh(); OnHeartbeat(session); session.ExitSession(); Interlocked.Decrement(ref runningNum); return true; } return false; }
/// <summary> /// /// </summary> /// <param name="packageReader"></param> /// <param name="package"></param> /// <returns></returns> protected virtual bool TryBuildPackage(PackageReader packageReader, out RequestPackage package) { package = null; Guid proxySid; packageReader.TryGetParam("ssid", out proxySid); int actionid; if (!packageReader.TryGetParam("actionid", out actionid)) { return false; } int msgid; if (!packageReader.TryGetParam("msgid", out msgid)) { return false; } int userId; packageReader.TryGetParam("uid", out userId); string sessionId; string proxyId; packageReader.TryGetParam("sid", out sessionId); packageReader.TryGetParam("proxyId", out proxyId); package = new RequestPackage(msgid, sessionId, actionid, userId) { ProxySid = proxySid, ProxyId = proxyId, IsProxyRequest = packageReader.ContainsKey("isproxy"), RouteName = packageReader.RouteName, IsUrlParam = true, Params = packageReader.Params, Message = packageReader.InputStream, OriginalParam = packageReader.RawParam }; return true; }
/// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="package"></param> /// <returns></returns> public virtual bool TryDecodePackage(HttpContext context, out RequestPackage package) { package = null; if (context == null) { return false; } var d = context.Request["d"] ?? ""; var nvc = HttpUtility.ParseQueryString(d); Dictionary<string, string> param = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); foreach (var key in nvc.AllKeys) { param[key] = nvc[key]; } string sessionId = param.ContainsKey("sid") ? param["sid"] : ""; int msgId = (param.ContainsKey("MsgId") ? param["MsgId"] : "0").ToInt(); int actionId = (param.ContainsKey("actionId") ? param["actionId"] : "0").ToInt(); int userId = (param.ContainsKey("uid") ? param["uid"] : "0").ToInt(); Guid proxySid; if (!param.ContainsKey("ssid") || !Guid.TryParse(param["ssid"], out proxySid)) { proxySid = Guid.Empty; } string proxyId = param.ContainsKey("proxyId") ? param["proxyId"] : ""; package = new RequestPackage(msgId, sessionId, actionId, userId) { ProxySid = proxySid, ProxyId = proxyId, IsProxyRequest = param.ContainsKey("isproxy"), IsUrlParam = true, UrlParam = d, }; return true; }
/// <summary> /// /// </summary> /// <param name="package"></param> /// <param name="session"></param> protected virtual void BuildHearbeatPackage(RequestPackage package, GameSession session) { }
public ActionGetter GetActionGetter(RequestPackage package, GameSession session) { return new ActionGetter(package, session); }
private GameSession GetSession(ConnectionEventArgs e, RequestPackage package) { //使用代理分发器时,每个ssid建立一个游服Serssion GameSession session; if (package.ProxySid != Guid.Empty) { session = GameSession.Get(package.ProxySid) ?? (package.IsProxyRequest ? GameSession.Get(e.Socket.HashCode) : GameSession.CreateNew(package.ProxySid, e.Socket, socketLintener.PostSend)); if (session != null) { session.ProxySid = package.ProxySid; } } else { session = GameSession.Get(package.SessionId) ?? GameSession.Get(e.Socket.HashCode); } if (session != null && !session.Connected) { GameSession.Recover(session, e.Socket.HashCode, e.Socket, socketLintener.PostSend); } return session; }
/// <summary> /// Decode request package /// </summary> /// <param name="e"></param> /// <param name="package"></param> /// <returns></returns> public virtual bool TryDecodePackage(ConnectionEventArgs e, out RequestPackage package) { package = null; var param = new Dictionary <string, string>(StringComparer.InvariantCultureIgnoreCase); string paramStr = Encoding.ASCII.GetString(e.Data); int index = paramStr.IndexOf("?d=", StringComparison.CurrentCultureIgnoreCase); string routeName = string.Empty; if (index != -1) { if (paramStr.StartsWith("route:", StringComparison.CurrentCultureIgnoreCase)) { routeName = paramStr.Substring(6, index - 6); } paramStr = paramStr.Substring(index, paramStr.Length - index); paramStr = HttpUtility.ParseQueryString(paramStr)["d"]; } LoadParamString(param, paramStr); if (param.ContainsKey("route")) { routeName = param["route"]; } //if (!param.ContainsKey("ssid")) { Interlocked.Increment(ref errorDropNum); return; } if (!param.ContainsKey("actionid")) { return(false); } if (!param.ContainsKey("msgid")) { return(false); } //sessionId of proxy server Guid proxySid; if (!param.ContainsKey("ssid") || !Guid.TryParse(param["ssid"], out proxySid)) { proxySid = Guid.Empty; } int msgid; if (!int.TryParse(param["msgid"], out msgid)) { return(false); } int actionid; if (!int.TryParse(param["actionid"], out actionid)) { return(false); } int userId; int.TryParse(param["uid"], out userId); string sessionId = param.ContainsKey("sid") ? param["sid"] : ""; string proxyId = param.ContainsKey("proxyId") ? param["proxyId"] : ""; package = new RequestPackage(msgid, sessionId, actionid, userId) { ProxySid = proxySid, ProxyId = proxyId, IsProxyRequest = param.ContainsKey("isproxy"), RouteName = routeName, IsUrlParam = true, UrlParam = paramStr, OpCode = e.Meaage.OpCode, CommandMessage = e.Socket.IsWebSocket && e.Meaage.OpCode == OpCode.Text ? e.Meaage.Message : null }; return(true); }