コード例 #1
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);
 }
コード例 #2
0
 public void ProcessPackage(RequestPackage package, GameSession session)
 {
     if (package == null)
     {
         return;
     }
     try
     {
         var          watch = RunTimeWatch.StartNew(string.Format("当前线程{0},{1}协议执行时间", Thread.CurrentThread.ManagedThreadId, package.ActionId));
         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)
             {
                 session.SendAsync(actionGetter.OpCode, data, 0, data.Length, OnSendCompleted);
             }
         }
         catch (Exception ex)
         {
             TraceLog.WriteError("PostSend error:{0}", ex);
         }
         watch.Flush(true);
     }
     catch (Exception ex)
     {
         TraceLog.WriteError("Task error:{0}", ex);
     }
     finally
     {
         if (session != null)
         {
             session.ExitSession();
         }
     }
 }
コード例 #3
0
ファイル: GameWebSocketHost.cs プロジェクト: file1987/Scut
        private void 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)
                    {
                        session.SendAsync(actionGetter.OpCode, data, 0, data.Length);
                    }
                }
                catch (Exception ex)
                {
                    TraceLog.WriteError("PostSend error:{0}", ex);
                }
            }
            catch (Exception ex)
            {
                TraceLog.WriteError("Task error:{0}", ex);
            }
            finally
            {
                if (session != null)
                {
                    session.ExitSession();
                }
            }
        }
コード例 #4
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);
     }
 }
コード例 #5
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);
     }
 }
コード例 #6
0
ファイル: GameSocketHost.cs プロジェクト: WaylandGod/Scut
 /// <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();
 }
コード例 #7
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);
            }
        }
コード例 #8
0
ファイル: ActionFactory.cs プロジェクト: suncle/Scut
        /// <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);
                }
            }
        }
コード例 #9
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);
 }
コード例 #10
0
ファイル: ActionFactory.cs プロジェクト: ioying/Scut
        /// <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);
                }
            }
        }
コード例 #11
0
ファイル: GameSocketHost.cs プロジェクト: yunjoker/Scut
 /// <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);
     }
 }
コード例 #12
0
ファイル: GameSocketHost.cs プロジェクト: yunjoker/Scut
        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();
            }
        }