SuperSocket快速入门(三):实现你的AppServer和AppSession

时间:2022-10-17 07:38:47

什么是AppSession?

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

什么是AppServer?

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

第一步:创建你的AppSession

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

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

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

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

第二步:创建你的AppServer类型

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

 // 现在 TelnetSession 将可以用在 TelnetServer 的会话中,也有很多方法可以重载
public class TelnetServer : AppServer<TelnetSession>
{
protected override bool Setup(IRootConfig rootConfig, IServerConfig config)
{
// 对家配置文件进行相应的修改。
return base.Setup(rootConfig, config);
} protected override void OnStartup()
{
// 服务器启动的逻辑部分
base.OnStartup();
} protected override void OnStopped()
{
// 停止服务器的逻辑部分
base.OnStopped();
}
}

第三步:启动你的服务器

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

// 第一种方法,代码启动。
static void Main(string[] args)
{
// 注意是TelnetServer
var appServer = new TelnetServer();
appServer.Setup();
// 开始监听
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

SuperSocket快速入门(三):实现你的AppServer和AppSession的更多相关文章

  1. SuperSocket快速入门(二):启动程序以及相关的配置

    如何快速启动第一个程序 既然是快速入门,所以,对于太深奥的知识点将不做讲解,会在后续的高级应用章节中,会对SS进行拆解.所有的实例90%都是来自SS的实例,外加本人的注释进行讲解. 一般应用而言,你只 ...

  2. SuperSocket快速入门(一):什么是SuperSocket

    什么是SuperSocket SuperSocket(下文简称SS)是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Socket, 如何维护 ...

  3. SuperSocket入门(二)- 探索AppServer、AppSession,Conmmand和App&period;config

          在上一篇文章中,我们已经了解到了如何在SuperSocket处理客户端请求. 同时我们可能会发现一个问题,如果我们的服务器端包含有很多复杂的业务逻辑,这样的switch/case代码将会很 ...

  4. Mysql快速入门&lpar;三&rpar;

    MySQL性能优化之查看执行计划explain 介绍: (1).MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发 ...

  5. 我的第一个Socket程序-SuperSocket使用入门&lpar;三&rpar;

    本来博客都停了,不打算更了,但今天百度一个socket的问题时无意间发现第一篇的socket文章权重仅次于SuperSocket网站,顿时觉得自己6到不行,再写一篇,讨论下数据持久化的问题 去年搞那个 ...

  6. Linux Bash Shell快速入门 &lpar;三&rpar;

    forfor 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是: for $var in dostatmentsdone 其中 $var 是循环控制变量, 是 $var 需要 ...

  7. Ant快速入门&lpar;三&rpar;-----定义生成文件

    适应Ant的关键就是编写生成文件,生成文件定义了该项目的各个生成任务(以target来表示,每个target表示一个生成任务),并定义生成任务之间的依赖关系. Ant生成文件的默认名为build.xm ...

  8. jquery快速入门三

    事件 常用事件 click(function(){.......}) #触发或将函数绑定到指定元素的click事件 hover(function(){.....}) 当鼠标指针悬停在上面时触发.... ...

  9. Solr&period;NET快速入门&lpar;三&rpar;【高亮显示】

    此功能会"高亮显示"匹配查询的字词(通常使用标记),包括匹配字词周围的文字片段. 要启用高亮显示,请包括HighlightingParameters QueryOptions对象, ...

随机推荐

  1. Java EE开发平台随手记4——Mybatis扩展3

    接着昨天的Mybatis扩展——IDaoTemplate接口. 扩展9:批量执行 1.明确什么是批量执行 首先说明一下,这里的批量执行不是利用<foreach>标签生成一长串的sql字符串 ...

  2. 程序设计入门——C语言 第4周编程练习 1 素数和(5分)

    题目内容: 我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推. 现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的 ...

  3. Axios、Lodash、TweenJS

    Axios是一个基于promise的HTTP库 http://chuansong.me/n/394228451820 Lodash是一个JavaScript的函数工具集 http://www.css8 ...

  4. HDU 2870 Largest Submatrix

    这三道题的关系是这样的,1505是1506的加强版,2870又是1505的加强版 如果按照上面由简到易的顺序来做的话,还是很简单的 这道题的思想就是 枚举+DP 因为某些字符可以变值,所以我们枚举a, ...

  5. (转)用eclipse创建一个j2ee的web工程后&comma;左面projects窗口中的项目如何没有显示webRoot文件夹&comma;除了src的文件夹&comma;其他都不显示

    左边目录窗口的右上方,有个向下的箭头,点里面的filters,把所有的勾都去掉看看

  6. 抓取网页中数据 -----51book中城市码

    ================== 获取网页中span标签里面的t_id的值 public function getpreg(){ $www = 'http://monkey.test.tripb. ...

  7. C&num;简单接口和继承示例详解——快速入门

    上一篇中我们说到继承,其实他们之间是差不多的. 接口是方法的抽象,如果不同的类有同样的方法,那么就应该考虑使用接口. C#中接口可以多继承,接口之间可以相互继承和多继承.一个类可以同时继承一个类和多个 ...

  8. SpringBoot单元测试

    一.Service层Junit单元测试 需要的jar包 <dependency> <groupId>org.springframework.boot</groupId&g ...

  9. 91&period; Reverse Linked List 反转链表

    网址:https://leetcode.com/problems/reverse-linked-list/ 直接参考92:https://www.cnblogs.com/tornado549/p/10 ...

  10. 常用lua代码块

    1.读取请求体中参数 local request_method = ngx.var.request_method local args --获取参数的值 if "GET" == r ...