zoukankan      html  css  js  c++  java
  • SupperSocket深入浅出(二)

    如果还没有看SuperStock深入浅出(一) ,请先看

    这一章,主要说下命令是如果运行的。刚开始的时候会发现拷别人的代码命令是可以运行的,在修改的过程中突然发现命令无效了?

    这里什么原因?,我先把代码贴出来。

    SuperSocket.SocketBase.AppServerBase类,可以执行命令代码,但你会发现

    if (m_RequestHandler == null)语名,只有m_RequestHandler为空时才执行。
    
    
    protected virtual void ExecuteCommand(TAppSession session, TRequestInfo requestInfo)
            {
                if (m_RequestHandler == null)
                {
                    var commandProxy = GetCommandByName(requestInfo.Key);
    
                    if (commandProxy != null)
                    {
                        var command = commandProxy.Command;
                        var commandFilters = commandProxy.Filters;
    
                        session.CurrentCommand = requestInfo.Key;
    
                        var cancelled = false;
    
                        if (commandFilters == null)
                        {
                            command.ExecuteCommand(session, requestInfo);
                        }
                        else
                        {
                            var commandContext = new CommandExecutingContext();
                            commandContext.Initialize(session, requestInfo, command);
    
                            for (var i = 0; i < commandFilters.Length; i++)
                            {
                                var filter = commandFilters[i];
                                filter.OnCommandExecuting(commandContext);
    
                                if (commandContext.Cancel)
                                {
                                    cancelled = true;
                                    if(Logger.IsInfoEnabled)
                                        Logger.Info(session, string.Format("The executing of the command {0} was cancelled by the command filter {1}.", command.Name, filter.GetType().ToString()));
                                    break;
                                }
                            }
    
                            if (!cancelled)
                            {
                                try
                                {
                                    command.ExecuteCommand(session, requestInfo);
                                }
                                catch (Exception exc)
                                {
                                    commandContext.Exception = exc;
                                }
    
                                for (var i = 0; i < commandFilters.Length; i++)
                                {
                                    var filter = commandFilters[i];
                                    filter.OnCommandExecuted(commandContext);
                                }
    
                                if (commandContext.Exception != null && !commandContext.ExceptionHandled)
                                {
                                    try
                                    {
                                        session.InternalHandleExcetion(commandContext.Exception);
                                    }
                                    catch
                                    {
    
                                    }
                                }
                            }
                        }
    
                        if(!cancelled)
                        {
                            session.PrevCommand = requestInfo.Key;
    
                            if (Config.LogCommand && Logger.IsInfoEnabled)
                                Logger.Info(session, string.Format("Command - {0}", requestInfo.Key));
                        }
                    }
                    else
                    {
                        session.InternalHandleUnknownRequest(requestInfo);
                    }
    
                    session.LastActiveTime = DateTime.Now;
                }
                else
                {
                    session.CurrentCommand = requestInfo.Key;
    
                    try
                    {
                        m_RequestHandler(session, requestInfo);
                    }
                    catch (Exception e)
                    {
                        session.InternalHandleExcetion(e);
                    }
                    
                    session.PrevCommand = requestInfo.Key;
                    session.LastActiveTime = DateTime.Now;
    
                    if (Config.LogCommand && Logger.IsInfoEnabled)
                        Logger.Info(session, string.Format("Command - {0}", requestInfo.Key));
                }
    
                Interlocked.Increment(ref m_TotalHandledRequests);
            }
    那么 m_RequestHandler 对象又是什么呢,其它很简单,
    private RequestHandler<TAppSession, TRequestInfo> m_RequestHandler;
    
            /// <summary>
            /// Occurs when a full request item received.
            /// </summary>
            public virtual event RequestHandler<TAppSession, TRequestInfo> NewRequestReceived
            {
                add { m_RequestHandler += value; }
                remove { m_RequestHandler -= value; }
            }
    //app.NewRequestReceived += new SuperSocket.SocketBase.RequestHandler<JCSoftSession, JCSocket.RequestInfo.JCSoftRequestInfo>(app_NewRequestReceived);
    你只要不对Appserver.NewRequestReceived 监听事件就可以了使用命令了


     那么在AppServer中 ExecuteCommand 又是怎样执行的呢。

    大家可以这样想,首先一定要接收到客户端消息,才会调用命令,这样不难我们就相会想到Session对像,有了正确的判断,你不对发现在下面的代码

    SuperSocket.SocketBase.AppSession 类

    int IAppSession.ProcessRequest(byte[] readBuffer, int offset, int length, bool toBeCopied)
            {
                int rest, offsetDelta;
    
                while (true)
                {
                    var requestInfo = FilterRequest(readBuffer, offset, length, toBeCopied, out rest, out offsetDelta);
    
                    if (requestInfo != null)
                    {
                        try
                        {
                            AppServer.ExecuteCommand(this, requestInfo);
                        }
                        catch (Exception e)
                        {
                            HandleException(e);
                        }
                    }
    
                    if (rest <= 0)
                    {
                        return offsetDelta;
                    }
    
                    //Still have data has not been processed
                    offset = offset + length - rest;
                    length = rest;
                }
            }

     最后命令的写法要用public 修饰一下

     分析到这里,就可以结束了。

  • 相关阅读:
    phpexcel Could not open for reading! File does not exist.
    tp5 微信JSAPI支付
    ajax返回数据不跳success
    tp5 paginate带参翻页
    php 小程序 前后端POST通信
    小程序页面跳转不同方法
    小程序添加购物车
    小程序商城数量加减效果
    Include conf/extra/httpd-ssl.conf apache 无法启动
    SQL 实验详细源码参考
  • 原文地址:https://www.cnblogs.com/qq247039968/p/7839447.html
Copyright © 2011-2022 走看看