public bool TryDecodePackage(HttpListenerContext context, out RequestPackage package)
 {
     int statuscode;
     if (TryDecodePackage(context.Request, out package, out statuscode))
     {
         return true;
     }
     return false;
 }
Exemple #2
0
        /// <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;
 }
Exemple #6
0
 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;
        }
Exemple #8
0
        /// <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);
 }
Exemple #10
0
 /// <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);
 }
Exemple #11
0
        /// <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);
            }
        }
Exemple #12
0
        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();
            }
        }
Exemple #13
0
        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));
 }
Exemple #15
0
 /// <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 };
 }
Exemple #17
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="package"></param>
 /// <param name="session"></param>
 public HttpGet(RequestPackage package, GameSession session)
     : base(package, session)
 {
     _paramString = package.UrlParam ?? "";
     InitData(_paramString);
 }
Exemple #18
0
        /// <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);
            }
        }
Exemple #19
0
 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;
            }
        }
Exemple #21
0
        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;
        }
Exemple #22
0
        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();
            }
        }
Exemple #23
0
 public virtual ActionGetter GetActionGetter(RequestPackage package)
 {
     return new HttpGet(package);
 }
Exemple #24
0
 /// <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;
 }
Exemple #25
0
 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;
 }
Exemple #26
0
        /// <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;

        }
Exemple #27
0
 /// <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);
     }
 }
Exemple #28
0
        /// <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));
        }
Exemple #29
0
 /// <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);
 }
Exemple #30
0
        /// <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;
        }
Exemple #31
0
 /// <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);
 }
Exemple #32
0
        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;
        }
Exemple #33
0
        /// <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;
        }
Exemple #34
0
        /// <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;
        }
Exemple #35
0
        /// <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);
 }
Exemple #37
0
 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;
 }
Exemple #38
0
        /// <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);
        }