一 基本概念

会话(Session)是客户端与服务器进行通信的基本单元,也是一个Socket的封装,在http协议中也有Session机制,其主要作用封装一个通信单元socket,负责服务器与客户端消息发送与接收,会话之间相互独立互不干扰且拥有唯一SessionId标识,维护着客户与服务器通信的生命周期。

二 SocketSession

SocketSession是SuperSocket建立在消息收发层的会话,其主要作用在于客户与服务器通信,其生命周期主要由创建,初始化,启动,运行,关闭过程组成;

2.1 创建

SocketSession的创建源于服务器监听端口接收到一个客户端连接请求,取出该连接的Socket触发新客户端请求事件,且看代码

private IAppSession ProcessNewClient(Socket client, SslProtocols security)
{
//取出预先准备好的SocketAsyncEventArgsProxy代理
SocketAsyncEventArgsProxy socketEventArgsProxy;
if (!m_ReadWritePool.TryPop(out socketEventArgsProxy))
{
AppServer.AsyncRun(client.SafeClose);
if (AppServer.Logger.IsErrorEnabled)
AppServer.Logger.ErrorFormat("Max connection number {0} was reached!", AppServer.Config.MaxConnectionNumber);

return null;
}

ISocketSession socketSession;

if (security == SslProtocols.None)
socketSession = new AsyncSocketSession(client, socketEventArgsProxy);
else
socketSession = new AsyncStreamSocketSession(client, security, socketEventArgsProxy);

var session = CreateSession(client, socketSession);

//很大原因在于被连接过滤掉了这个地址,所以把拿出来的资源重置后在压入连接栈,并关闭端口
if (session == null)
{
socketEventArgsProxy.Reset();
this.m_ReadWritePool.Push(socketEventArgsProxy);
AppServer.AsyncRun(client.SafeClose);
return null;
}

socketSession.Closed += SessionClosed;

var negotiateSession = socketSession as INegotiateSocketSession;

if (negotiateSession == null)
{
if (RegisterSession(session))
{
AppServer.AsyncRun(() => socketSession.Start());
}

return session;
}

negotiateSession.NegotiateCompleted += OnSocketSessionNegotiateCompleted;
negotiateSession.Negotiate();

return null;
}

1)每一个客户端Socket都将交由SocketAsyncEventArgsProxy代理托管,该代理主要用着socket连接是否断开判断;

2)首先创建一个SocketSession实例,将该实例作为AppSession创建的参数;

3)创建AppSession

2.2 初始化AppSession

1) 初始化SocketSession和SocketAsyncProxy代理

在初始化SocketSession过程中主要完成了 发送队列参数和代理设置;

2)SocketAsyncProxy代理初始化

当连接断开时将触发接收一次消息,即Socket最后一次操作处理将触发Socket是否断开验证,从而触发Session关闭

2.3 启动会话

这里将Start方法交给一个Task并行执行任务执行,也就是托管在线程池中,并处理Task终止异常;自此SocketSession将开始工作接收客户端发送的消息

2.4 工作

其工作模式为:开始接收数据包,接收完成后交给AppSession处理该数据包,进而继续接收数据,此过程均是同步进行

2.5 会话关闭

首先会话关闭也就是Socket连接断开的原因有很多,如客户端主动断开,或者服务器过滤掉该会话,或者消息收发异常及其他严重异常也将导致该会话关闭终止,且看如何处理Socket的终止,

1)接收验证

首先在Socket上下文代理SocketAsyncProxy中将处理Socket最后一次接收,在每一次处理接收消息是将验证处理的数据包谁否完成,将验证该Socket连接的有效性,如图所示,如果没有任务数据包传输则判定该Socket失效,将关闭该会话

2)发送验证

如果发送的数据包为0那么也认定该Socket失效导致Session关闭

3)关闭Session

SocketSession的关闭将触发AppServer会话关闭事件,进而触发AppSession的关闭,回收会话相关资源,代理等至此一次完整的会话周期完成

SuperSocket源码解析之会话生命周期的更多相关文章

  1. SuperSocket源码解析之消息处理

    一 简述 Tcp消息的处理本身是与Tcp消息传输过程独立的,是消息的两个不同阶段,从前面的会话生命周期我们已经知道消息的传输主要有SocketSession实现,而真正处理则交由AppSession实 ...

  2. SuperSocket源码解析之开篇

    一 简介 官方介绍:SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 S ...

  3. SuperSocket源码解析之开篇 (转)

    一 简介 官方介绍:SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 Socket 连接和 S ...

  4. 一起学习vue源码 - Vue2.x的生命周期(初始化阶段)

    作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e8 ...

  5. 从BeanFactory源码看Bean的生命周期

    下图是我搜索"Spring Bean生命周期"找到的图片,来自文章--Spring Bean的生命周期 下面,我们从AbstractAutowireCapableBeanFacto ...

  6. React源码剖析系列 - 生命周期的管理艺术

    目前,前端领域中 React 势头正盛,很少能够深入剖析内部实现机制和原理.本系列文章希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. 对于 React,其组件生命周期(C ...

  7. React 源码剖析系列 - 生命周期的管理艺术

    目前,前端领域中 React 势头正盛,很少能够深入剖析内部实现机制和原理. 本系列文章 希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. 对于 React,其组件生命周期 ...

  8. Spring5源码分析之Bean生命周期

    Spring Bean生命周期的构成 Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类: Bean自身的方法: 这个包括了Bean本身调用的方法和通过配置文件中<bean&g ...

  9. Vue源码之组件化/生命周期(个人向)

    大致流程 具体流程 组件化 (createComponent) 构造⼦类构造函数 const baseCtor = context.$options._base // plain options ob ...

随机推荐

  1. 通过SSIS监控远程服务器磁盘空间并发送邮件报警

    本文直接参考了博客园软件人生的文章操作的,写在这里只为做个记录. 到公司这边先把两个报表服务器接收了. 为防止宕机,部署个磁盘警告的SSIS包. Step 1 建立两个变量来接收和写入磁盘容量 Ste ...

  2. 融合python2和python3

    很多情况下你可能会想要开发一个程序能同时在python2和python3中运行. 想象一下你开发了一个模块,成百上千的人都在使用它,但不是所有的用户都同时使用python 2和3.这种情况下你有两个选 ...

  3. GridView用法的修改和删除

    (前台) <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="Fa ...

  4. 隐藏APK在Launcher中的启动图标 android开发教程

    隐藏APK在Launcher中的启动图标: APK的AndroidManifest.xml文件的主Activity中删除 intent-filter 中的 <category android:n ...

  5. BZOJ 1600: [Usaco2008 Oct]建造栅栏

    1600: [Usaco2008 Oct]建造栅栏 Time Limit: 5 Sec  Memory Limit: 64 MB Description 勤奋的Farmer John想要建造一个四面的 ...

  6. Girls and Boys(匈牙利)

    Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. SQL Server 2008 还原数据库

    1.得到数据库备份文件,怎么得到的,[能够看这里]~ 2.把备份文件加个.bak 的后缀,比如: 3.打开SQL , 你能够新建一个空数据库 , 或者利用原有的数据库 , 点击右键>>任务 ...

  8. uva 10599 - Robots(II) (dp | 记忆化搜索)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  9. 【OpenCV】OpenCV2.4.6 与Visiual Studio 2008,Python2.7.5配置和图像载入显示

    自从OpenCV2.2开始,OpenCV 库便分成几个模块并位于lib文件中,本节介绍从OpenCV2.4.6与VS2008 .Python2.7.5如何配置环境,如何外部文件载 入图像.在窗口中显示 ...

  10. stm32之USART通信

    任何USART通信,需要用到2个对外连接的引脚:RxD,TxD: RxD是输入引脚,用于串行数据接收: TxD是输出引脚,用于串行数据发送: SCLK引脚:发生器时钟输出(同步模式下,异步模式下不需要 ...