SuperSocket\SocketBase\Protocol\TerminatorReceiveFilter.cs

  /// <summary>
/// Filters received data of the specific session into request info.
/// </summary>
/// <param name="readBuffer">The read buffer.</param>
/// <param name="offset">The offset of the current received data in this read buffer.</param>
/// <param name="length">The length of the current received data.</param>
/// <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
/// <param name="rest">The rest, the length of the data which hasn't been parsed.</param>
/// <returns>return the parsed TRequestInfo</returns>
public override TRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest)
{
rest = ; int prevMatched = m_SearchState.Matched; int result = readBuffer.SearchMark(offset, length, m_SearchState); if (result < )
{
if (m_OffsetDelta != m_ParsedLengthInBuffer)
{
Buffer.BlockCopy(readBuffer, offset - m_ParsedLengthInBuffer, readBuffer, offset - m_OffsetDelta, m_ParsedLengthInBuffer + length); m_ParsedLengthInBuffer += length;
m_OffsetDelta = m_ParsedLengthInBuffer;
}
else
{
m_ParsedLengthInBuffer += length; if (m_ParsedLengthInBuffer >= m_Session.Config.ReceiveBufferSize)
{
this.AddArraySegment(readBuffer, offset + length - m_ParsedLengthInBuffer, m_ParsedLengthInBuffer, toBeCopied);
m_ParsedLengthInBuffer = ;
m_OffsetDelta = ; return NullRequestInfo;
} m_OffsetDelta += length;
} return NullRequestInfo;
} var findLen = result - offset;
var currentMatched = m_SearchState.Mark.Length - prevMatched; //The prev matched part is not belong to the current matched terminator mark
if (prevMatched > && findLen != )
{
//rest prevMatched to 0
prevMatched = ;
currentMatched = m_SearchState.Mark.Length;
} rest = length - findLen - currentMatched; TRequestInfo requestInfo; if (findLen > )
{
if(this.BufferSegments != null && this.BufferSegments.Count > )
{
this.AddArraySegment(readBuffer, offset - m_ParsedLengthInBuffer, findLen + m_ParsedLengthInBuffer, toBeCopied);
requestInfo = ProcessMatchedRequest(BufferSegments, , BufferSegments.Count);
}
else
{
requestInfo = ProcessMatchedRequest(readBuffer, offset - m_ParsedLengthInBuffer, findLen + m_ParsedLengthInBuffer);
}
}
else if (prevMatched > )
{
if (m_ParsedLengthInBuffer > )
{
if (m_ParsedLengthInBuffer < prevMatched)
{
BufferSegments.TrimEnd(prevMatched - m_ParsedLengthInBuffer);
requestInfo = ProcessMatchedRequest(BufferSegments, , BufferSegments.Count);
}
else
{
if (this.BufferSegments != null && this.BufferSegments.Count > )
{
this.AddArraySegment(readBuffer, offset - m_ParsedLengthInBuffer, m_ParsedLengthInBuffer - prevMatched, toBeCopied);
requestInfo = ProcessMatchedRequest(BufferSegments, , BufferSegments.Count);
}
else
{
requestInfo = ProcessMatchedRequest(readBuffer, offset - m_ParsedLengthInBuffer, m_ParsedLengthInBuffer - prevMatched);
}
}
}
else
{
BufferSegments.TrimEnd(prevMatched);
requestInfo = ProcessMatchedRequest(BufferSegments, , BufferSegments.Count);
}
}
else
{
if (this.BufferSegments != null && this.BufferSegments.Count > )
{
if (m_ParsedLengthInBuffer > )
{
this.BufferSegments.AddSegment(readBuffer, offset, m_ParsedLengthInBuffer);
} requestInfo = ProcessMatchedRequest(BufferSegments, , BufferSegments.Count);
}
else
{
//在这里解析的时候,返回类型
requestInfo = ProcessMatchedRequest(readBuffer, offset - m_ParsedLengthInBuffer, m_ParsedLengthInBuffer);
}
} InternalReset(); if(rest == )
{
m_OffsetDelta = ;
}
else
{
m_OffsetDelta += (length - rest);
} return requestInfo;
}
 protected override StringRequestInfo ProcessMatchedRequest(byte[] data, int offset, int length)
{
if(length == )
return m_RequestParser.ParseRequestInfo(string.Empty); return m_RequestParser.ParseRequestInfo(m_Encoding.GetString(data, offset, length));
}

SuperSocket\SocketBase\Protocol\TerminatorReceiveFilter.cs

TerminatorReceiveFilter.cs文件包含2个类

 public abstract class TerminatorReceiveFilter<TRequestInfo> : ReceiveFilterBase<TRequestInfo>, IOffsetAdapter, IReceiveFilterInitializer
where TRequestInfo : IRequestInfo
public class TerminatorReceiveFilter : TerminatorReceiveFilter<StringRequestInfo>

SuperSocket\SocketBase\Protocol\StringRequestInfo.cs

 public class StringRequestInfo : RequestInfo<string>

AppSession在初始化的时候,指定了ReceiveFilter

SuperSocket\SocketBase\AppSession.cs

 /// <summary>
/// Initializes the specified app session by AppServer and SocketSession.
/// </summary>
/// <param name="appServer">The app server.</param>
/// <param name="socketSession">The socket session.</param>
public virtual void Initialize(IAppServer<TAppSession, TRequestInfo> appServer, ISocketSession socketSession)
{
var castedAppServer = (AppServerBase<TAppSession, TRequestInfo>)appServer;
AppServer = castedAppServer;
Charset = castedAppServer.TextEncoding;
SocketSession = socketSession;
SessionID = socketSession.SessionID;
m_Connected = true;
m_ReceiveFilter = castedAppServer.ReceiveFilterFactory.CreateFilter(appServer, this, socketSession.RemoteEndPoint); var filterInitializer = m_ReceiveFilter as IReceiveFilterInitializer;
if (filterInitializer != null)
filterInitializer.Initialize(castedAppServer, this); socketSession.Initialize(this); OnInit();
}

F:\CodeForGitBlit\SuperSocket\SocketBase\AppServer.cs

     internal override IReceiveFilterFactory<StringRequestInfo> CreateDefaultReceiveFilterFactory()
{
return new CommandLineReceiveFilterFactory(TextEncoding);
}

F:\CodeForGitBlit\SuperSocket\SocketBase\Protocol\CommandLineReceiveFilterFactory.cs

 public class CommandLineReceiveFilterFactory : TerminatorReceiveFilterFactory

return m_RequestParser.ParseRequestInfo(m_Encoding.GetString(data, offset, length));

F:\CodeForGitBlit\SuperSocket\SocketBase\Protocol\BasicRequestInfoParser.cs

  public class BasicRequestInfoParser : IRequestInfoParser<StringRequestInfo>
  public StringRequestInfo ParseRequestInfo(string source)
{
int pos = source.IndexOf(m_Spliter); string name = string.Empty;
string param = string.Empty; if (pos > )
{
name = source.Substring(, pos);
param = source.Substring(pos + );
}
else
{
name = source;
} return new StringRequestInfo(name, param,
param.Split(m_ParameterSpliters, StringSplitOptions.RemoveEmptyEntries));
}

SuperSocket内置的命令行协议的解析的更多相关文章

  1. SuperSocket内置的命令行协议

    内置的命令行协议(接受自定义,分隔符为“:”,“,”): 命令行协议定义了每个请求必须以回车换行结尾 "\r\n". 由于 SuperSocket 中内置的命令行协议用空格来分割请 ...

  2. SuperSocket入门(四)-命令行协议

         前面已经了解了supersocket的一些基本的属性及相关的方法,下面就进入重点的学习内容,通信协议.在没有看官方的文档之前,对于协议的理解首先想到的是TCP和UDP协议.TCP 和 UDP ...

  3. cinderclient命令行源码解析

    一.简介 openstack的各个模块中,都有相应的客户端模块实现,其作用是为用户访问具体模块提供了接口,并且也作为模块之间相互访问的途径.Cinder也一样,有着自己的cinder-client. ...

  4. JDK内置工具命令

    javap Java反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件用法:javap 用法 描述 javap -help —help -? 输出此用法消息 javap -versi ...

  5. shell 学习笔记4-shell内置变量命令

    一.shell 的一些内置命令 常用的一内部命令有:echo.eval.exec.export.read.shift 1.echo命令-在屏幕中输出信息 1)说明 格式:echo args #< ...

  6. python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04

    多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...

  7. shell-变量输入内置read命令详解

    1. shell变量的输入 shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入得. [语法格式] read [参数] [变量名] [常用参数] -p:指定读取值时的提示符: ...

  8. python 命令行參数解析

    本文是从我还有一个博客转载过来的,欢迎大家点击进去看一下,帮我添加点人气^_^ ImPyy 选择模块 依据python參考手冊的提示,optparse 已经废弃,应使用 argparse 教程 概念 ...

  9. PIVOT内置函数实现行转列

    PIVOT用于将列值旋转为列名(即行转列),PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(va ...

随机推荐

  1. webstorm中配置过visualsvn,后面做更改要更换authentication realm的解决办法

    找这个找了好久,一直改不过来,终于找到了解决办法 首先,在提交代码时提示: 但是我的authentication realm已经时这个了,并且账号和密码也改了,所以要更改authentication ...

  2. 利用php生成验证码

    <?php /** * php生成验证码 * @param $width 画布宽 * @param $height 画布高 * @param $vcodelen 验证码长度 * @param $ ...

  3. 01--SQLite学习网站参考

    1.   SQLite基本操作 见我的02—SQLite一步到位 sqlite3编程笔记 . http://blog.csdn.net/wl_haanel/article/details/623141 ...

  4. CSS——宠物demo

    注意:ul中自带padding值,需要清除. <!DOCTYPE html> <html lang="en"> <head> <meta ...

  5. 如何用java生成随机验证码

     1.VerifyCode 类:   1 package com.HRuinger.enity;                          ImageIO.write(image, " ...

  6. MyBatis入门2_增删改查+数据库字段和实体字段不一致情况

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 当数据库字段和实体bean中属性不一致时 之前数据库P ...

  7. PAT_A1114#Family Property

    Source: PAT A1114 Family Property (25 分) Description: This time, you are supposed to help us collect ...

  8. js 图表转图片

    最近项目上有个需求,是将一些teechart做的图表转换成图片插入自动生成的PDF里,Teechart绘图和如何生成PDF这些这里就不说了,这个任务比较别扭的一点是,图表自动生成,且整个过程中页面不能 ...

  9. 猜数字游戏的提示(Master-Mind Hints, UVa 340)

    实现一个经典"猜数字"游戏. 给定答案序列和用户猜的序列,统计有多少数字位置正确 (A),有多少数字在两个序列都出现过但位置不对(B). 输入包含多组数据.每组输入第一行为序列长度 ...

  10. postgresql数据库部署

    运维开发技术交流群欢迎大家加入一起学习(QQ:722381733) 一.postgresql数据库部署 1.前往postgresql安装包的目录(这里我部署的是10.5的版本) [root@web1 ...