这篇文章出要是SuperSocket底层如何接收数据

Process(ArraySegment<byte> segment) 获取加载数据(直到数据全部接收后返回)
namespace SuperSocket.ProtoBase
{
/// <summary>
/// The default pipeline processor
/// </summary>
/// <typeparam name="TPackageInfo">The type of the package info.</typeparam>
public class DefaultPipelineProcessor<TPackageInfo> : IPipelineProcessor
where TPackageInfo : IPackageInfo
{
private IReceiveFilter<TPackageInfo> m_ReceiveFilter; private IReceiveFilter<TPackageInfo> m_FirstReceiveFilter; private BufferList m_ReceiveCache; private int m_MaxPackageLength; /// <summary>
/// Initializes a new instance of the <see cref="DefaultPipelineProcessor{TPackageInfo}"/> class.
/// </summary>
/// <param name="receiveFilter">The initializing receive filter.</param>
/// <param name="maxPackageLength">The max package size.</param>
public DefaultPipelineProcessor(IReceiveFilter<TPackageInfo> receiveFilter, int maxPackageLength = )
{
m_FirstReceiveFilter = m_ReceiveFilter = receiveFilter;
m_ReceiveCache = new BufferList();
m_MaxPackageLength = maxPackageLength;
} private void PushResetData(ArraySegment<byte> raw, int rest)
{
var segment = new ArraySegment<byte>(raw.Array, raw.Offset + raw.Count - rest, rest);
m_ReceiveCache.Add(segment);
} private IList<IPackageInfo> GetNotNullOne(IList<IPackageInfo> left, IList<IPackageInfo> right)
{
if (left != null)
return left; return right;
} /// <summary>
/// Processes the input segment.
/// </summary>
/// <param name="segment">The input segment.</param>
/// <returns>
/// the processing result
/// </returns>
public virtual ProcessResult Process(ArraySegment<byte> segment)
{
var receiveCache = m_ReceiveCache; receiveCache.Add(segment); var rest = ; var currentReceiveFilter = m_ReceiveFilter; SingleItemList<IPackageInfo> singlePackage = null; List<IPackageInfo> packageList = null; while (true)
{
var lastItemLength = receiveCache.Last.Count;
var packageInfo = currentReceiveFilter.Filter(receiveCache, out rest); if (currentReceiveFilter.State == FilterState.Error)
{
return ProcessResult.Create(ProcessState.Error);
}
//最大缓存空间
if (m_MaxPackageLength > )
{
var length = receiveCache.Total; if (length > m_MaxPackageLength)
{
return ProcessResult.Create(ProcessState.Error, string.Format("Max package length: {0}, current processed length: {1}", m_MaxPackageLength, length));
}
} var nextReceiveFilter = currentReceiveFilter.NextReceiveFilter; // don't reset the filter if no request is resolved
if(packageInfo != null)
currentReceiveFilter.Reset(); if (nextReceiveFilter != null)
{
currentReceiveFilter = nextReceiveFilter;
m_ReceiveFilter = currentReceiveFilter;
} // continue receive
if (packageInfo == null)
{
if (rest > )
{
var last = receiveCache.Last; if(rest != lastItemLength)
{
PushResetData(segment, rest);
} continue;
} return ProcessResult.Create(ProcessState.Cached, GetNotNullOne(packageList, singlePackage));
} if (packageList != null)
{
packageList.Add(packageInfo);
}
else if (singlePackage == null)
singlePackage = new SingleItemList<IPackageInfo>(packageInfo);
else
{
if (packageList == null)
packageList = new List<IPackageInfo>(); packageList.Add(singlePackage[]);
packageList.Add(packageInfo);
singlePackage = null;
} if (packageInfo is IBufferedPackageInfo // is a buffered package
&& (packageInfo as IBufferedPackageInfo).Data is BufferList) // and it uses receive buffer directly
{
// so we need to create a new receive buffer container to use
m_ReceiveCache = receiveCache = new BufferList(); if (rest <= )
{
return ProcessResult.Create(ProcessState.Cached, GetNotNullOne(packageList, singlePackage));
}
}
else
{
m_ReceiveCache.Clear(); if (rest <= )
{
return ProcessResult.Create(ProcessState.Completed, GetNotNullOne(packageList, singlePackage));
}
} PushResetData(segment, rest);
}
} /// <summary>
/// cleanup the cached the buffer by resolving them into one package at the end of the piple line
/// </summary>
/// <returns>return the processing result</returns>
public void Reset()
{
m_ReceiveCache.Clear();
m_FirstReceiveFilter.Reset(); if (m_ReceiveFilter != m_FirstReceiveFilter)
m_ReceiveFilter = m_FirstReceiveFilter;
} /// <summary>
/// Gets the received cache.
/// </summary>
/// <value>
/// The cache.
/// </value>
public BufferList Cache
{
get { return m_ReceiveCache; }
}
}
}

SupperSocket深入浅出的更多相关文章

  1. SupperSocket深入浅出(二)

    如果还没有看SuperStock深入浅出(一) ,请先看 这一章,主要说下命令是如果运行的.刚开始的时候会发现拷别人的代码命令是可以运行的,在修改的过程中突然发现命令无效了? 这里什么原因?,我先把代 ...

  2. SupperSocket深入浅出(一)

    花了几天时间了解了SupperSocket工作原理,各各类之间的工作关系.SupperSocket大部资料网上都有,但写的都不适合初学者. 今天花点时间写下这几天的学习成果,一方面是为了将来更好的回顾 ...

  3. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  4. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  5. 深入浅出Struts2+Spring+Hibernate框架

    一.深入浅出Struts2 什么是Struts2? struts2是一种基于MVC的轻量级的WEB应用框架.有了这个框架我们就可以在这个框架的基础上做起,这样就大大的提高了我们的开发效率和质量,为公司 ...

  6. DOM 事件深入浅出(二)

    在DOM事件深入浅出(一)中,我主要给大家讲解了不同DOM级别下的事件处理程序,同时介绍了事件冒泡和捕获的触发原理和方法.本文将继续介绍DOM事件中的知识点,主要侧重于DOM事件中Event对象的属性 ...

  7. DOM 事件深入浅出(一)

    在项目开发时,我们时常需要考虑用户在使用产品时产生的各种各样的交互事件,比如鼠标点击事件.敲击键盘事件等.这样的事件行为都是前端DOM事件的组成部分,不同的DOM事件会有不同的触发条件和触发效果.本文 ...

  8. 深入浅出node(2) 模块机制

    这部分主要总结深入浅出Node.js的第二章 一)CommonJs 1.1CommonJs模块定义 二)Node的模块实现 2.1模块分类 2.2 路径分析和文件定位 2.2.1 路径分析 2.2.2 ...

  9. IOS 网络-深入浅出(一 )-> 三方SDWebImage

    首要我们以最为常用的UIImageView为例介绍实现原理: 1)UIImageView+WebCache:  setImageWithURL:placeholderImage:options: 先显 ...

随机推荐

  1. linux下Python3的安装

    linux平台下,需要gcc和openssl-devel的依赖包,所以没有的话需要先安装: yum -y install gcc*   yum -y install openssl-devel 然后将 ...

  2. 简析Chrome和Webkit的渊源

    http://www.3lian.com/edu/2012/05-25/28803.html 互联网的浪潮从未停息,而用以网上冲浪的冲浪板也一直在变得愈加精良.自人们进入互联网时代以来,即已经发生了三 ...

  3. UVa 1639 - Candy(数学期望 + 精度处理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. 【bbs】index、post

    列表 奇数行和偶数行设置不同的背景 http://blog.csdn.net/facecrazy/article/details/51252850 实现ul li中的内容上下左右居中,不用设置li宽度 ...

  5. mongoDB的常用语法

    安装: 到mongodb官网下载安装包或者压缩包:https://www.mongodb.com/download-center?jmp=nav 1.如果是msi包的话则点击按步骤安装,如果是压缩包的 ...

  6. Spring(八)之基于Java配置

    基于 Java 的配置 到目前为止,你已经看到如何使用 XML 配置文件来配置 Spring bean.如果你熟悉使用 XML 配置,那么我会说,不需要再学习如何进行基于 Java 的配置是,因为你要 ...

  7. [USACO08JAN]电话线$Telephone \ \ Lines$(图论$+SPFA+$ 二分答案)

    #\(\mathcal{\color{red}{Description}}\) \(Link\) 给定一个图,请你求出在把其中自由选择的\(k\)条的权值都置为零的情况下,图中\(1-N\)最短路上的 ...

  8. SDOI2018 二轮培训划水记

    \(\mathcal{Day -1}\) 嗯,虽然说\(rqy\)看我们这么懵O,并不建议我们去掺和这种神仙打架,但是为了逃文化课学习OI并参观膜拜各路神仙,我毅然决然地选择去参加这次培训-- 这次一 ...

  9. MySQL5.7.19 免安装配置 + Navicat for MySQL安装和破解(附全部资源)

    近段时间因为工作原因安装了好多次本地MySQL,安装过程也是时有曲折,索性记录一下. 环境: Win10 家庭版 MySQL5.7.19   (链接:https://pan.baidu.com/s/1 ...

  10. 使用ant design组件时,Select设置mode="multiple"或mode="tags"时遇到问题:Uncaught Error: must set key for <rc-animate> children

    import {Select} from 'antd'; <Select className={styles.edit_area_dialog_table_select_input_layout ...