SuperSocket内置的命令行协议的解析
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内置的命令行协议的解析的更多相关文章
- SuperSocket内置的命令行协议
内置的命令行协议(接受自定义,分隔符为“:”,“,”): 命令行协议定义了每个请求必须以回车换行结尾 "\r\n". 由于 SuperSocket 中内置的命令行协议用空格来分割请 ...
- SuperSocket入门(四)-命令行协议
前面已经了解了supersocket的一些基本的属性及相关的方法,下面就进入重点的学习内容,通信协议.在没有看官方的文档之前,对于协议的理解首先想到的是TCP和UDP协议.TCP 和 UDP ...
- cinderclient命令行源码解析
一.简介 openstack的各个模块中,都有相应的客户端模块实现,其作用是为用户访问具体模块提供了接口,并且也作为模块之间相互访问的途径.Cinder也一样,有着自己的cinder-client. ...
- JDK内置工具命令
javap Java反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件用法:javap 用法 描述 javap -help —help -? 输出此用法消息 javap -versi ...
- shell 学习笔记4-shell内置变量命令
一.shell 的一些内置命令 常用的一内部命令有:echo.eval.exec.export.read.shift 1.echo命令-在屏幕中输出信息 1)说明 格式:echo args #< ...
- python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04
多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...
- shell-变量输入内置read命令详解
1. shell变量的输入 shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入得. [语法格式] read [参数] [变量名] [常用参数] -p:指定读取值时的提示符: ...
- python 命令行參数解析
本文是从我还有一个博客转载过来的,欢迎大家点击进去看一下,帮我添加点人气^_^ ImPyy 选择模块 依据python參考手冊的提示,optparse 已经废弃,应使用 argparse 教程 概念 ...
- PIVOT内置函数实现行转列
PIVOT用于将列值旋转为列名(即行转列),PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(va ...
随机推荐
- elasticsearch——海量文档高性能索引系统
elasticsearch elasticsearch是一个高性能高扩展性的索引系统,底层基于apache lucene. 可结合kibana工具进行可视化. 概念: index 索引: 类似SQL中 ...
- 第一个真正意义的jsp程序,连接msql数据库
1. mysql数据库 :在百度上下一个安装包mysql-5.7.17.msi,只装服务即可,选择开发使用 2.建库,建表 mysql> create table testdb; 导入相关建表 ...
- 微信小程序音频长度获取的问题
小程序推荐使用wx.createInnerAudioContext()创建的innerAudioContext,我们也通过这个接口创建音频.音频的长度可以通过属性获取: 但是,给innerAudioC ...
- c#中动态创建textbox并且从数据库中获取表中数据添加到textbox中
private void FormLugOther_Load(object sender, EventArgs e) { foreach (string str in FormLug.FieldLis ...
- todey
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> 框架集fromset ...
- CF1148D-Dirty Deeds Done Dirt Cheap
这轮CF怎么充满了替身啊233(这是场只有替身使者才能看见的比赛) 题解可以看官方的 这里就是记录下自己当初是怎么没做上的233 忽视掉了分类后pair本身就会带有的性质(a<b or a> ...
- C - CJSON
cJSON API 说明 cJSON_Version() 获得cJSON的版本 cJSON_InitHooks(); 初始化cJSON_Hooks结构体 cJSON_Parse(); 将字符串解析 ...
- inet_XX族函数
在网络编程中, 经常会将网络字节转为本地字节或者将本地字节转为网络字节, 但是如果每次我们都是都通过htonl, ntohl函数需要将10进制转为整数, 甚至还用将字符串转为整数, 再转为网络字节, ...
- Win32中 DLL、Lib 库的创建机器使用
Windows 下 的静态库和动态库 一.静态函数库(Lib) 1. 静态函数库的制作(C/C++) —— 打开新建项目,然后选中Win32项目,接着在创建项目中选择 Lib,再接着将函数.实现功能的 ...
- Scrapy Item用法示例(保存item到MySQL数据库,MongoDB数据库,使用官方组件下载图片)
需要学习的地方: 保存item到MySQL数据库,MongoDB数据库,下载图片 1.爬虫文件images.py # -*- coding: utf-8 -*- from scrapy import ...