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 修饰一下
分析到这里,就可以结束了。
以上只是个人想法和实践经验所得,如果有文字错误和语法错误,请加以指点!
QQ:247039968
emil:wujc@younger.com
无论是美女的歌声,还是鬣狗的狂吠,无论是鳄鱼的眼泪,还是恶狼的嚎叫,都不会使我动摇