zoukankan      html  css  js  c++  java
  • SuperSocket快速入门(三):实现你的AppServer和AppSession

    什么是AppSession?

      AppSession 代表一个和客户端的逻辑连接,基于连接的操作应该定义于在该类之中。你可以用该类的实例发送数据到客户端,接收客户端发送的数据或者关闭连接。同时可以保存客户端所关联的数据。

    什么是AppServer?

      AppServer 代表了监听客户端连接,承载TCP连接的服务器实例。理想情况下,我们可以通过AppServer实例获取任何你想要的客户端连接,服务器级别的操作和逻辑应该定义在此类之中。

    第一步:创建你的AppSession

      为什么要创建AppSession呢,本人认为,快速入门系统,以下三点足够你用的了。

    1. 需要重新实现会话创建、收到未知的协议数据的时候、处理异常等可重载的方法,像异常,只是做了记录日志操作,部分方法都是不处理。
    2. 需要关联一些数据,同时AppSession提供了可存放最多10个数据的Items的属性(IDictionary<object, object>类型)。
    3. 需要其他对象来实现自定义协议。
     1 // 在下面的代码中,当一个新的连接连接上时,服务器端立即向客户端发送欢迎信息。 这段代码还重写了其它AppSession的方法用以实现自己的业务逻辑。
     2 public class TelnetSession : AppSession<TelnetSession>
     3 {
     4     // 重载OnSessionStarted函数,赞同于appServer.NewSessionConnected += NewSessionConnected
     5     protected override void OnSessionStarted()
     6     {
     7         // 会话链接成功后的逻辑部分。
     8         this.Send("Welcome to SuperSocket Telnet Server");
     9     }
    10 
    11     protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
    12     {
    13         // 收到未知请求的逻辑部分
    14         this.Send("Unknow request");
    15     }
    16 
    17     protected override void OnSessionClosed(CloseReason reason)
    18     {
    19         // 会话关闭后的逻辑代码
    20         base.OnSessionClosed(reason);
    21     }
    22 }
    23 
    24 // 你可以根据你的业务需求来给Session类增加新的属性
    25 public class PlayerSession :AppSession<PlayerSession>
    26 {
    27     public int GameHallId { get; internal set; }
    28 
    29     public int RoomId { get; internal set; }
    30 }

    上述代码中,两个自定义的AppSession都是使用的命令行协议。由于泛型约束在自定义AppSession的时候,泛型TAppSession一定要指定所定义的类,很多朋友像命令无法加载啦、服务器启动不起来等等,都是因为这里定义错误造成的。

    有朋友就会问了,为什么不能直接继承AppSession呢?不好意思,快速入门系列不做补脑,在第一章的内容中已经说过。

    第二步:创建你的AppServer类型

    如果你创建自己的AppSession并希望使用它,那么必须要创建所对应的AppServer。

     1 // 现在 TelnetSession 将可以用在 TelnetServer 的会话中,也有很多方法可以重载
     2 public class TelnetServer : AppServer<TelnetSession>
     3 {
     4     protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
     5     {
     6         // 对家配置文件进行相应的修改。
     7         return base.Setup(rootConfig, config);
     8     }
     9 
    10     protected override void OnStartup()
    11     {
    12         // 服务器启动的逻辑部分
    13         base.OnStartup();
    14     }
    15 
    16     protected override void OnStopped()
    17     {
    18         // 停止服务器的逻辑部分
    19         base.OnStopped();
    20     }
    21 }

    第三步:启动你的服务器

    还记录上一节我们讲的内容,如何启动你的SS么?

    // 第一种方法,代码启动。
    static void Main(string[] args)
    {
        // 注意是TelnetServer
        var appServer = new TelnetServer();
        appServer.Setup(2012);
        // 开始监听
        appServer.Start();
        while (Console.ReadKey().KeyChar != 'q')
        {
            Console.WriteLine();
            continue;
        }
        // 停止服务器。
        appServer.Stop();
    }
    
    // 第二种方法,通过配置启动,需要注意的是,一定要注意配置好,不然启动会失败的,这里没有判断初始化成功与否,可以看源码里面的例子。
    static void Main(string[] args)
    {
        var bootstrap = BootstrapFactory.CreateBootstrap();
        bootstrap.Initialize();
        bootstrap.Start();
        while (Console.ReadKey().KeyChar != 'q')
        {
            Console.WriteLine();
            continue;
        }
        bootstrap.Stop();
    }

    通过配置启动,需要注意的是,一定要配置正确,不然无法正常启动你的AppServer,其中serverType="AppServer的完整名称, 类所在程序集",如:serverType="SuperSocket.QuickStart.TelnetServer_StartByConfig.TelnetServer, SuperSocket.QuickStart.TelnetServer_StartByConfig"。

    到此,如何启动SS以及如果简单的实现你的AppServer和AppSession并启动你的AppServer完成,在下一章节中,我们讲解如果关联Command。

    优点

      实现你自己的AppSession和AppServer允许你根据你业务的需求来方便的扩展SuperSocket,你可以绑定session的连接和断开事件,服务器实例的启动和停止事件。你还可以在AppServer的Setup方法中读取你的自定义配置信息。总而言之,这些功能让你方便的创建一个你所需要的socket服务器成为可能。

    参考文献:http://docs.supersocket.net/v1-6/zh-CN/Implement-your-AppServer-and-AppSession

  • 相关阅读:
    干嘛
    有一种姑娘 你只想温柔以待
    衡阳拜佛
    浅谈程序员的英语学习【转】
    linux下用C编写的基于smtp的邮件发送程序【转】
    清空消息队列的缓存buffer
    不要对C++类对象或struct对象做memset操作
    xml解析编辑网站
    gdb调试
    喂狗机制 Software Dog
  • 原文地址:https://www.cnblogs.com/wkavenger/p/4663161.html
Copyright © 2011-2022 走看看