Пример #1
0
 /// <summary>
 ///
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="userList"></param>
 /// <param name="actionId"></param>
 /// <param name="parameter">Allow Parameters or Custom object as paramter</param>
 /// <param name="complateHandle"></param>
 /// <param name="opCode"></param>
 /// <param name="onlineInterval"></param>
 public static async System.Threading.Tasks.Task SendAction <T>(List <T> userList, int actionId, object parameter, Action <T, GameSession, SocketAsyncResult> complateHandle, sbyte opCode, int onlineInterval) where T : IUser
 {
     foreach (var user in userList)
     {
         T           temp    = user;
         GameSession session = GameSession.Get(user.GetUserId());
         if (session != null)
         {
             RequestPackage package = parameter is Parameters
                 ? GetResponsePackage(actionId, session, parameter as Parameters, opCode, null)
                 : GetResponsePackage(actionId, session, null, opCode, parameter);
             await SendAction(session, actionId, package, (s, result) =>
             {
                 if (complateHandle != null)
                 {
                     complateHandle(temp, session, result);
                 }
             }, onlineInterval);
         }
         else
         {
             if (complateHandle != null)
             {
                 complateHandle(temp, null, new SocketAsyncResult(null)
                 {
                     Result = ResultCode.Close
                 });
             }
         }
     }
 }
Пример #2
0
 /// <summary>
 ///
 /// </summary>
 public override void Start(string[] args)
 {
     socketListener.StartListen();
     if (EnableHttp)
     {
         httpListener.Start();
         foreach (var prefix in httpListener.Prefixes)
         {
             TraceLog.WriteLine("{0} Http service:{1} is started.", DateTime.Now.ToString("HH:mm:ss"), prefix.TrimEnd('/'));
         }
         httpListener.BeginGetContext(OnHttpRequest, httpListener);
     }
     EntitySyncManger.SendHandle += (userId, data) =>
     {
         GameSession session = GameSession.Get(userId);
         if (session != null)
         {
             var task = session.SendAsync(OpCode.Binary, data, 0, data.Length, result => { });
             task.Wait();
             return(task.Result);
         }
         return(false);
     };
     TraceLog.WriteLine("{0} Socket service {1}:{2} is started.", DateTime.Now.ToString("HH:mm:ss"), _setting.GameIpAddress, _setting.GamePort);
     base.Start(args);
 }
Пример #3
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="actionId"></param>
        /// <param name="userList"></param>
        /// <param name="parameter">Allow Parameters or Custom object as paramter</param>
        /// <param name="complateHandle"></param>
        /// <param name="opCode"></param>
        /// <param name="onlineInterval"></param>
        /// <returns></returns>
        public static async System.Threading.Tasks.Task BroadcastAction <T>(int actionId, List <T> userList, object parameter, Action <T, GameSession, SocketAsyncResult> complateHandle, sbyte opCode, int onlineInterval) where T : IUser
        {
            List <GameSession> sessionList = new List <GameSession>();
            GameSession        session;

            foreach (var user in userList)
            {
                session = GameSession.Get(user.GetUserId());
                if (session == null)
                {
                    complateHandle(user, null, new SocketAsyncResult(null)
                    {
                        Result = ResultCode.Close
                    });
                }
                sessionList.Add(session);
            }
            if (sessionList.Count == 0)
            {
                return;
            }

            RequestPackage package = parameter is Parameters
                ? GetResponsePackage(actionId, sessionList[0], parameter as Parameters, opCode, null)
                : GetResponsePackage(actionId, sessionList[0], null, opCode, parameter);

            await BroadcastAction(actionId, sessionList, package, (s, result) =>
            {
                if (complateHandle != null)
                {
                    complateHandle((T)s.User, s, result);
                }
            }, onlineInterval);
        }
Пример #4
0
        /// <summary>
        /// 构造函数
        /// </summary>
        public HttpGet(HttpRequest request)
            : base(null, null)
        {
            _paramString = request["d"] ?? "";
            InitData(_paramString);
            //http
            string sessionId = "";

            if (_param.ContainsKey(ParamSid))
            {
                sessionId = _param[ParamSid];
            }
            if (string.IsNullOrEmpty(sessionId))
            {
                sessionId = request[ParamSid];
            }
            _session = GameSession.Get(sessionId) ?? GameSession.CreateNew(Guid.NewGuid(), request);

            //set cookie
            var cookie = request.Cookies.Get(ParamSid);

            if (cookie == null && HttpContext.Current != null)
            {
                cookie         = new HttpCookie(ParamSid, SessionId);
                cookie.Expires = DateTime.Now.AddMinutes(5);
                HttpContext.Current.Response.Cookies.Add(cookie);
            }
        }
Пример #5
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);
            }
            session.InitSocket(e.Socket, socketListener);
            return(session);
        }
Пример #6
0
 /// <summary>
 /// 构造函数
 /// </summary>
 public HttpGet(HttpRequest request)
 {
     _paramString = request["d"] ?? "";
     InitData(_paramString);
     //http
     if (_param.ContainsKey("sid"))
     {
         SessionId = _param["sid"];
     }
     _session = GameSession.Get(SessionId)
                ?? GameSession.CreateNew(Guid.NewGuid(), request);
 }
Пример #7
0
 /// <summary>
 /// Send async, add 16 len head
 /// </summary>
 /// <param name="opCode"></param>
 /// <param name="data"></param>
 /// <param name="offset"></param>
 /// <param name="count"></param>
 /// <param name="callback"></param>
 /// <returns></returns>
 public async System.Threading.Tasks.Task <bool> SendAsync(sbyte opCode, byte[] data, int offset, int count, Action <SocketAsyncResult> callback)
 {
     if (!_upAgentGuid.Equals(Guid.Empty))
     {
         var upAgentSession = GameSession.Get(_upAgentGuid);
         if (upAgentSession != null && customSendHandler != null)
         {
             return(await customSendHandler(SessionId, opCode, data, offset, count, callback));
         }
     }
     return(await PostSend(opCode, data, 0, data.Length, callback));
 }
Пример #8
0
 /// <summary>
 /// 将指定的Action结果广播给指定范围的玩家
 /// </summary>
 /// <typeparam name="T">BaseUser对象</typeparam>
 /// <param name="actionId">指定的Action</param>
 /// <param name="userList">指定范围的玩家</param>
 /// <param name="parameters">请求参数</param>
 /// <param name="successHandle">成功回调</param>
 /// <param name="onlineInterval">online interval second</param>
 public static void BroadcastAction <T>(int actionId, List <T> userList, Parameters parameters, Action <T> successHandle, int onlineInterval = 0) where T : IUser
 {
     try
     {
         if (userList.Count == 0)
         {
             return;
         }
         StringBuilder shareParam = new StringBuilder();
         if (parameters != null)
         {
             foreach (var parameter in parameters)
             {
                 shareParam.AppendFormat("&{0}={1}", parameter.Key, parameter.Value);
             }
         }
         IActionDispatcher actionDispatcher = new ScutActionDispatcher();
         ActionGetter      actionParam;
         byte[]            sendData = GetActionResponse(actionDispatcher, actionId, userList[0], shareParam.ToString(), out actionParam);
         foreach (T user in userList)
         {
             if (object.Equals(user, null))
             {
                 continue;
             }
             try
             {
                 GameSession session = GameSession.Get(user.GetUserId());
                 if (session != null)
                 {
                     if ((onlineInterval <= 0 || session.LastActivityTime > MathUtils.Now.AddSeconds(-onlineInterval)) &&
                         session.SendAsync(actionParam.OpCode, sendData, 0, sendData.Length))
                     {
                         if (successHandle != null)
                         {
                             successHandle(user);
                         }
                     }
                 }
             }
             catch (Exception ex)
             {
                 TraceLog.WriteError("BroadcastAction  action:{0} userId:{1} error:{2}", actionId, user.GetUserId(), ex);
             }
         }
     }
     catch (Exception ex)
     {
         TraceLog.WriteError("BroadcastAction  action:{0} error:{1}", actionId, ex);
     }
 }
Пример #9
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 = GameSession.Get(package.SessionId) ?? GameSession.CreateNew(Guid.NewGuid(), context.Request);
            }
            return(session);
        }
Пример #10
0
        public async Task <IHttpResponseAction> Execute(IHttpRequestContext context)
        {
            int            statusCode;
            RequestPackage package;
            var            actionDispatcher = GameEnvironment.Setting.ActionDispatcher;

            if (!actionDispatcher.TryDecodePackage(context.Request, out package, out statusCode))
            {
                return(new ByteResponse(statusCode, statusCode == 200 ? "OK" : "FAIL", new byte[0]));
            }

            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);
            }
            package.Bind(session);

            ActionGetter httpGet = actionDispatcher.GetActionGetter(package, session);

            if (package.IsUrlParam)
            {
                httpGet["UserHostAddress"] = session.RemoteAddress;
                httpGet["ssid"]            = session.KeyCode.ToString("N");
                httpGet["http"]            = "1";
            }

            var result = await System.Threading.Tasks.Task.Run <byte[]>(() =>
            {
                try
                {
                    return(ScriptEngines.GetCurrentMainScript().ProcessRequest(package, httpGet));
                }
                catch (Exception ex)
                {
                    TraceLog.WriteError("Excute mainclass error:{0}", ex);
                    return(new byte[0]);
                }
            });

            return(new ByteResponse(statusCode, "OK", result));
        }
Пример #11
0
        /// <summary>
        /// 获取Action处理的输出字节流
        /// </summary>
        /// <returns></returns>
        public static byte[] GetActionResponse(IActionDispatcher actionDispatcher, int actionId, BaseUser baseUser, string urlParam, out ActionGetter actionGetter)
        {
            int userId = baseUser != null?baseUser.GetUserId() : 0;

            GameSession session   = GameSession.Get(userId);
            string      sessionId = session != null ? session.SessionId : "";
            string      param     = string.Format("MsgId={0}&St={1}&Sid={2}&Uid={3}&ActionID={4}{5}",
                                                  0,
                                                  "st",
                                                  sessionId,
                                                  userId,
                                                  actionId,
                                                  urlParam);

            RequestPackage requestPackage = new RequestPackage(0, sessionId, actionId, userId);

            requestPackage.UrlParam    = param;
            requestPackage.IsUrlParam  = true;
            requestPackage.Session     = session;
            requestPackage.ReceiveTime = DateTime.Now;
            actionGetter = new HttpGet(requestPackage);
            BaseStruct         baseStruct = FindRoute(GameEnvironment.Setting.ActionTypeName, actionGetter, actionId);
            SocketGameResponse response   = new SocketGameResponse();

            response.WriteErrorCallback += actionDispatcher.ResponseError;
            baseStruct.UserFactory       = uid => { return(baseUser); };
            baseStruct.SetPush();
            baseStruct.DoInit();
            using (ILocking locking = baseStruct.RequestLock())
            {
                if (locking.IsLocked)
                {
                    if (!baseStruct.GetError() &&
                        baseStruct.ReadUrlElement() &&
                        baseStruct.DoAction() &&
                        !baseStruct.GetError())
                    {
                        baseStruct.WriteResponse(response);
                    }
                    else
                    {
                        baseStruct.WriteErrorAction(response);
                    }
                }
            }
            return(response.ReadByte());
        }
Пример #12
0
 private void OnDisconnected(ISocket sender, ConnectionEventArgs e)
 {
     try
     {
         GameSession session = GameSession.Get(e.Socket.HashCode);
         if (session != null)
         {
             OnDisconnected(session);
             session.ProxySid = Guid.Empty;
             session.Close();
         }
     }
     catch (Exception err)
     {
         TraceLog.WriteError("Disconnected error:{0}", err);
     }
 }
Пример #13
0
        /// <summary>
        /// 构造函数
        /// </summary>
        public HttpGet(HttpRequest request)
            : base(null, null)
        {
            _paramString = request["d"] ?? "";
            InitData(_paramString);
            //http
            string sessionId = "";

            if (_param.ContainsKey("sid"))
            {
                sessionId = _param["sid"];
            }
            if (string.IsNullOrEmpty(sessionId))
            {
                sessionId = request["sid"];
            }
            _session = GameSession.Get(sessionId) ?? GameSession.CreateNew(Guid.NewGuid(), request);
        }
Пример #14
0
 /// <summary>
 ///
 /// </summary>
 public override void Start(string[] args)
 {
     socketLintener.StartListen();
     if (EnableHttp)
     {
         httpListener.Start();
         httpListener.BeginGetContext(OnHttpRequest, httpListener);
     }
     EntitySyncManger.SendHandle += (userId, data) =>
     {
         GameSession session = GameSession.Get(userId);
         if (session != null)
         {
             return(session.SendAsync(data, 0, data.Length));
         }
         return(false);
     };
     OnStartAffer();
 }
Пример #15
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);
            }
            session.InitHttp(context.Request);
            return(session);
        }
Пример #16
0
        /// <summary>
        /// 获取Action处理的输出字节流
        /// </summary>
        /// <returns></returns>
        public static byte[] GetActionResponse(int actionId, BaseUser baseUser, string parameters, out HttpGet httpGet)
        {
            int userId = baseUser != null?baseUser.GetUserId() : 0;

            GameSession session   = GameSession.Get(userId);
            string      sessionId = session != null ? session.SessionId : "";
            string      param     = string.Format("MsgId={0}&St={1}&Sid={2}&Uid={3}&ActionID={4}{5}",
                                                  0,
                                                  "st",
                                                  sessionId,
                                                  userId,
                                                  actionId,
                                                  parameters);

            httpGet = new HttpGet(param, session);
            BaseStruct         baseStruct = FindRoute(GameEnvironment.Setting.ActionTypeName, httpGet, actionId);
            SocketGameResponse response   = new SocketGameResponse();

            baseStruct.UserFactory = uid => { return(baseUser); };
            baseStruct.SetPush();
            baseStruct.DoInit();
            using (ILocking locking = baseStruct.RequestLock())
            {
                if (locking.IsLocked)
                {
                    if (!baseStruct.GetError() &&
                        baseStruct.ReadUrlElement() &&
                        baseStruct.DoAction() &&
                        !baseStruct.GetError())
                    {
                        baseStruct.BuildPacket();
                        baseStruct.WriteAction(response);
                    }
                    else
                    {
                        baseStruct.WriteErrorAction(response);
                    }
                }
            }
            return(response.ReadByte());
        }
Пример #17
0
        /// <summary>
        /// 将指定的Action结果广播给指定范围的玩家
        /// </summary>
        /// <typeparam name="T">BaseUser对象</typeparam>
        /// <param name="actionId">指定的Action</param>
        /// <param name="userList">指定范围的玩家</param>
        /// <param name="parameters">请求参数</param>
        /// <param name="successHandle">成功回调</param>
        public static void BroadcastAction <T>(int actionId, List <T> userList, Parameters parameters, Action <T> successHandle) where T : IUser
        {
            StringBuilder shareParam = new StringBuilder();

            if (parameters != null)
            {
                foreach (var parameter in parameters)
                {
                    shareParam.AppendFormat("&{0}={1}", parameter.Key, parameter.Value);
                }
            }
            IActionDispatcher actionDispatcher = new ScutActionDispatcher();
            ActionGetter      actionParam;

            byte[] sendData = GetActionResponse(actionDispatcher, actionId, null, shareParam.ToString(), out actionParam);
            foreach (T user in userList)
            {
                if (object.Equals(user, null))
                {
                    continue;
                }
                try
                {
                    GameSession session = GameSession.Get(user.GetUserId());
                    if (session != null)
                    {
                        if (session.SendAsync(sendData, 0, sendData.Length))
                        {
                            if (successHandle != null)
                            {
                                successHandle(user);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    TraceLog.WriteError("BroadcastAction  action:{0} userId:{1} error:{2}", actionId, user.GetUserId(), ex);
                }
            }
        }
Пример #18
0
 /// <summary>
 ///
 /// </summary>
 public override void Start(string[] args)
 {
     socketListener.StartListen();
     if (EnableHttp)
     {
         httpListener.Start();
         httpListener.BeginGetContext(OnHttpRequest, httpListener);
     }
     EntitySyncManger.SendHandle += (userId, data) =>
     {
         GameSession session = GameSession.Get(userId);
         if (session != null)
         {
             var task = session.SendAsync(OpCode.Binary, data, 0, data.Length, result => { });
             task.Wait();
             return(task.Result);
         }
         return(false);
     };
     base.Start(args);
 }
Пример #19
0
        /// <summary>
        /// 获取Action处理的输出字节流
        /// </summary>
        /// <param name="actionDispatcher"></param>
        /// <param name="actionId"></param>
        /// <param name="baseUser"></param>
        /// <param name="urlParam"></param>
        /// <param name="actionGetter"></param>
        /// <returns></returns>
        public static byte[] GetActionResponse(IActionDispatcher actionDispatcher, int actionId, IUser baseUser, string urlParam, out ActionGetter actionGetter)
        {
            int userId = baseUser != null?baseUser.GetUserId() : 0;

            GameSession session   = GameSession.Get(userId);
            string      sessionId = session != null ? session.SessionId : "";
            string      param     = string.Format("MsgId={0}&St={1}&Sid={2}&Uid={3}&ActionID={4}{5}",
                                                  0,
                                                  "st",
                                                  sessionId,
                                                  userId,
                                                  actionId,
                                                  urlParam);
            RequestPackage requestPackage = new RequestPackage(0, sessionId, actionId, userId);

            requestPackage.UrlParam   = param;
            requestPackage.IsUrlParam = true;
            requestPackage.Bind(session);
            actionGetter = new HttpGet(requestPackage);
            return(GetActionResponse(actionDispatcher, actionId, baseUser, actionGetter));
        }
Пример #20
0
        /// <summary>
        /// 将指定的Action结果广播给指定范围的玩家
        /// </summary>
        /// <typeparam name="T">BaseUser对象</typeparam>
        /// <param name="actionId">指定的Action</param>
        /// <param name="userList">指定范围的玩家</param>
        /// <param name="parameters">请求参数</param>
        /// <param name="successHandle">成功回调</param>
        public static void BroadcastAction <T>(int actionId, List <T> userList, Parameters parameters, Action <T> successHandle) where T : BaseUser
        {
            StringBuilder shareParam = new StringBuilder();

            if (parameters != null)
            {
                foreach (var parameter in parameters)
                {
                    shareParam.AppendFormat("&{0}={1}", parameter.Key, parameter.Value);
                }
            }
            HttpGet httpGet;

            byte[] sendData = GetActionResponse(actionId, null, shareParam.ToString(), out httpGet);
            foreach (var user in userList)
            {
                if (user == default(T))
                {
                    continue;
                }
                try
                {
                    GameSession session = GameSession.Get(user.GetUserId());
                    if (session != null)
                    {
                        if (session.SendAsync(sendData, 0, sendData.Length))
                        {
                            if (successHandle != null)
                            {
                                successHandle(user);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    TraceLog.WriteError("BroadcastAction  action:{0} userId:{1} error:{2}", actionId, user.PersonalId, ex);
                }
            }
        }
Пример #21
0
        /// <summary>
        /// 给指定范围的每个玩家发送指定的Action结果
        /// </summary>
        /// <typeparam name="T">BaseUser对象</typeparam>
        /// <param name="userList">指定范围的玩家</param>
        /// <param name="actionId">指定的Action</param>
        /// <param name="parameters">请求参数</param>
        /// <param name="successHandle">成功回调</param>
        public static void SendAsyncAction <T>(List <T> userList, int actionId, Parameters parameters, Action <ActionGetter> successHandle) where T : BaseUser
        {
            StringBuilder shareParam = new StringBuilder();

            if (parameters != null)
            {
                foreach (var parameter in parameters)
                {
                    shareParam.AppendFormat("&{0}={1}", parameter.Key, parameter.Value);
                }
            }
            IActionDispatcher actionDispatcher = new ActionDispatcher();

            foreach (var user in userList)
            {
                if (user == default(T))
                {
                    continue;
                }
                try
                {
                    var          session = GameSession.Get(user.GetUserId());
                    ActionGetter actionParam;
                    byte[]       sendData = GetActionResponse(actionDispatcher, actionId, user, shareParam.ToString(), out actionParam);
                    if (session != null &&
                        session.SendAsync(sendData, 0, sendData.Length) &&
                        actionParam != null)
                    {
                        successHandle(actionParam);
                    }
                }
                catch (Exception ex)
                {
                    TraceLog.WriteError("SendToClient action:{0} userId:{1} error:{2}", actionId, user.PersonalId, ex);
                }
            }
        }
Пример #22
0
        private void OnHttpRequest(IAsyncResult result)
        {
            try
            {
                HttpListener        listener = (HttpListener)result.AsyncState;
                HttpListenerContext context  = listener.EndGetContext(result);
                listener.BeginGetContext(OnHttpRequest, listener);

                RequestPackage package;
                if (!ActionDispatcher.TryDecodePackage(context, out package))
                {
                    return;
                }

                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);
                }
                package.Bind(session);

                ActionGetter httpGet = ActionDispatcher.GetActionGetter(package);
                if (package.IsUrlParam)
                {
                    httpGet["UserHostAddress"] = session.EndAddress;
                    httpGet["ssid"]            = session.KeyCode.ToString("N");
                    httpGet["http"]            = "1";
                }

                var httpresponse = new SocketGameResponse();
                httpresponse.WriteErrorCallback += new ScutActionDispatcher().ResponseError;

                var clientConnection = new HttpClientConnection
                {
                    Context      = context,
                    Session      = session,
                    ActionGetter = httpGet,
                    GameResponse = httpresponse
                };
                clientConnection.TimeoutTimer = new Timer(OnHttpRequestTimeout, clientConnection, httpRequestTimeout, Timeout.Infinite);
                byte[] respData = new byte[0];
                if (!string.IsNullOrEmpty(package.RouteName))
                {
                    if (CheckRemote(package.RouteName, httpGet))
                    {
                        MessageStructure response = new MessageStructure();
                        OnCallRemote(package.RouteName, httpGet, response);
                        respData = response.PopBuffer();
                    }
                }
                else
                {
                    DoAction(httpGet, httpresponse);
                    respData = httpresponse.ReadByte();
                }
                OnHttpResponse(clientConnection, respData, 0, respData.Length);
            }
            catch (Exception ex)
            {
                TraceLog.WriteError("OnHttpRequest error:{0}", ex);
            }
        }
Пример #23
0
        private void socketLintener_DataReceived(object sender, ConnectionEventArgs e)
        {
            try
            {
                Interlocked.Increment(ref receiveNum);
                OnReceivedBefore(e);
                //if (isInStopping) return;
                Dictionary <string, string> param = new Dictionary <string, string>(StringComparer.InvariantCultureIgnoreCase);
                string paramStr  = Encoding.ASCII.GetString(e.Data);
                int    index     = paramStr.IndexOf("?d=");
                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);
                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"))
                {
                    Interlocked.Increment(ref errorDropNum); return;
                }
                if (!param.ContainsKey("msgid"))
                {
                    Interlocked.Increment(ref errorDropNum); return;
                }

                //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))
                {
                    Interlocked.Increment(ref errorDropNum); return;
                }
                int msgid;
                if (!int.TryParse(param["msgid"], out msgid))
                {
                    Interlocked.Increment(ref errorDropNum); return;
                }
                bool   isproxy   = param.ContainsKey("isproxy");//proxy server send
                string sessionId = param.ContainsKey("sid") ? param["sid"] : "";

                //使用代理分发器时,每个ssid建立一个游服Serssion
                GameSession session;
                if (proxySid != Guid.Empty)
                {
                    session = GameSession.Get(proxySid) ??
                              (isproxy
                                ? GameSession.Get(e.Socket.HashCode)
                                : GameSession.CreateNew(proxySid, e.Socket, socketLintener.PostSend));
                    session.ProxySid = proxySid;
                }
                else
                {
                    session = GameSession.Get(e.Socket.HashCode);
                }
                if (session != null && !session.Connected)
                {
                    GameSession.Recover(session, e.Socket.HashCode, e.Socket, socketLintener.PostSend);
                }
                if (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;
                }


                requestQueue.Enqueue(new RequestPackage
                {
                    Route       = routeName,
                    ActionId    = actionid,
                    Param       = paramStr,
                    Session     = session,
                    ReceiveTime = DateTime.Now
                });
                singal.Set();
            }
            catch (Exception ex)
            {
                TraceLog.WriteError("Received to Host:{0} error:{1}", e.Socket.RemoteEndPoint, ex);
            }
        }
Пример #24
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task <IHttpResponseAction> Execute(IHttpRequestContext context)
        {
            int            statusCode;
            RequestPackage package;
            var            actionDispatcher = GameEnvironment.Setting.ActionDispatcher;

            if (!actionDispatcher.TryDecodePackage(context.Request, out package, out statusCode))
            {
                return(new ByteResponse(statusCode, statusCode == 200 ? "OK" : "FAIL", new byte[0]));
            }

            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);
            }
            session.InitHttp(context.Request);
            session.RemoteAddress = context.UserHostAddress;
            package.Bind(session);

            ActionGetter httpGet = actionDispatcher.GetActionGetter(package, session);

            if (package.IsUrlParam)
            {
                httpGet["UserHostAddress"] = session.RemoteAddress;
                httpGet["ssid"]            = session.KeyCode.ToString("N");
                httpGet["http"]            = "1";
            }

            var result = await System.Threading.Tasks.Task.Run <byte[]>(() =>
            {
                try
                {
                    return(ScriptEngines.GetCurrentMainScript().ProcessRequest(package, httpGet));
                }
                catch (Exception ex)
                {
                    TraceLog.WriteError("Excute mainclass error:{0}", ex);
                    return(new byte[0]);
                }
            });

            string sessionId = session.SessionId;
            var    response  = new ByteResponse(statusCode, "OK", result, session.UserId.ToString())
            {
                RequestParams = package.OriginalParam
            };

            response.CookieHandle += ctx =>
            {
                var cookie = ctx.Request.Cookies["sid"];
                if (cookie == null)
                {
                    cookie         = new Cookie("sid", sessionId);
                    cookie.Expires = DateTime.Now.AddMinutes(5);
                    ctx.Response.SetCookie(cookie);
                }
            };
            return(response);
        }
Пример #25
0
        private void OnHttpRequest(IAsyncResult result)
        {
            try
            {
                HttpListener        listener = (HttpListener)result.AsyncState;
                HttpListenerContext context  = listener.EndGetContext(result);
                listener.BeginGetContext(OnHttpRequest, listener);
                HttpListenerRequest  request  = context.Request;
                HttpListenerResponse response = context.Response;
                string      sid = request.QueryString["sid"];
                GameSession session;
                if (string.IsNullOrEmpty(sid))
                {
                    session = GameSession.CreateNew(Guid.NewGuid(), request);
                }
                else
                {
                    session = GameSession.Get(sid) ?? GameSession.CreateNew(Guid.NewGuid(), request);
                }

                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;
                }

                var httpresponse = new SocketGameResponse();
                httpresponse.WriteErrorCallback += new ActionDispatcher().ResponseError;

                HttpGet httpGet = new HttpGet(new RequestPackage()
                {
                    UrlParam = data, Session = session
                });
                httpGet["UserHostAddress"] = session.EndAddress;
                httpGet["ssid"]            = session.KeyCode.ToString("N");
                httpGet["http"]            = "1";

                var clientConnection = new HttpClientConnection {
                    Context      = context,
                    Session      = session,
                    ActionGetter = httpGet,
                    GameResponse = httpresponse
                };
                clientConnection.TimeoutTimer = new Timer(OnHttpRequestTimeout, clientConnection, httpRequestTimeout, Timeout.Infinite);


                OnRequested(httpGet, httpresponse);
                byte[] respData = httpresponse.ReadByte();
                OnHttpResponse(clientConnection, respData, 0, respData.Length);
            }
            catch (Exception ex)
            {
                TraceLog.WriteError("OnHttpRequest error:{0}", ex);
            }
        }