zoukankan      html  css  js  c++  java
  • SuperSocket源码解析之会话生命周期

    一 基本概念

       会话(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的关闭,回收会话相关资源,代理等至此一次完整的会话周期完成

  • 相关阅读:
    CSS 中 Position relative 和 absolute区别
    感受到LDT的好处
    Map数据结构
    break和continue
    vue的ref属性
    css小样式
    搭建vue开发环境
    setTimeout和clearTimeout
    垂直居中
    vertical-align 属性
  • 原文地址:https://www.cnblogs.com/rjjs/p/5621600.html
Copyright © 2011-2022 走看看