SuperSocket服务器架设(三):在SuperSocket中自定义Command、AppServer和AppSession

1.      创建自定义类MySession,继承AppSession类并重写AppSession类的方法

注:一个AppSession对象对应一个连接

[csharp] view
plain
copyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using SuperSocket;
  6. using SuperSocket.Common;
  7. using SuperSocket.SocketBase;
  8. using SuperSocket.SocketBase.Protocol;
  9. namespace SuperSocketApp1
  10. {
  11. /// <summary>
  12. /// 自定义连接类MySession,继承AppSession,并传入到AppSession
  13. /// </summary>
  14. public class MySession : AppSession<MySession>
  15. {
  16. /// <summary>
  17. /// 新连接
  18. /// </summary>
  19. protected override void OnSessionStarted()
  20. {

[csharp] view
plain
copyprint?

  1. <span style="white-space:pre">  </span>    //输出客户端IP地址
  2. Console.WriteLine(this.LocalEndPoint.Address.ToString());
  3. this.Send("\n\rHello User");
  4. }
  5. /// <summary>
  6. /// 未知的Command
  7. /// </summary>
  8. /// <param name="requestInfo"></param>
  9. protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
  10. {
  11. this.Send("\n\r未知的命令");
  12. }
  13. /// <summary>
  14. /// 捕捉异常并输出
  15. /// </summary>
  16. /// <param name="e"></param>
  17. protected override void HandleException(Exception e)
  18. {
  19. this.Send("\n\r异常: {0}", e.Message);
  20. }
  21. /// <summary>
  22. /// 连接关闭
  23. /// </summary>
  24. /// <param name="reason"></param>
  25. protected override void OnSessionClosed(CloseReason reason)
  26. {
  27. base.OnSessionClosed(reason);
  28. }
  29. }
  30. }

2.      创建自定义类MyServer,继承AppServer类并重写AppServer类的方法

[csharp] view
plain
copyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using SuperSocket.SocketBase;
  6. using SuperSocket.SocketBase.Config;
  7. namespace SuperSocketApp1
  8. {
  9. /// <summary>
  10. /// 自定义服务器类MyServer,继承AppServer,并传入自定义连接类MySession
  11. /// </summary>
  12. public class MyServer : AppServer<MySession>
  13. {
  14. protected override void OnStartup()
  15. {
  16. base.OnStartup();
  17. Console.WriteLine("服务器已启动");
  18. }
  19. /// <summary>
  20. /// 输出新连接信息
  21. /// </summary>
  22. /// <param name="session"></param>
  23. protected override void OnNewSessionConnected(MySession session)
  24. {
  25. base.OnNewSessionConnected(session);

[csharp] view
plain
copyprint?

  1. <span style="white-space:pre">  </span>    //输出客户端IP地址
  2. Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":连接");
  3. }
  4. /// <summary>
  5. /// 输出断开连接信息
  6. /// </summary>
  7. /// <param name="session"></param>
  8. /// <param name="reason"></param>
  9. protected override void OnSessionClosed(MySession session, CloseReason reason)
  10. {
  11. base.OnSessionClosed(session, reason);
  12. <span style="font-family: monospace; white-space: pre;">    </span><span style="font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240);">    //输出客户端IP地址</span>
  13. Console.Write("\r\n" + session.LocalEndPoint.Address.ToString() + ":断开连接");
  14. }
  15. protected override void OnStopped()
  16. {
  17. base.OnStopped();
  18. Console.WriteLine("服务器已停止");
  19. }
  20. }
  21. }

3.      创建自定义命令HELLO类,继承CommandBase并重写ExecuteCommand方法

[csharp] view
plain
copyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using SuperSocket.SocketBase;
  6. using SuperSocket.SocketBase.Command;
  7. using SuperSocket.SocketBase.Protocol;
  8. namespace SuperSocketApp1
  9. {
  10. /// <summary>
  11. /// 自定义命令类HELLO,继承CommandBase,并传入自定义连接类MySession
  12. /// </summary>
  13. public class HELLO : CommandBase<MySession, StringRequestInfo>
  14. {
  15. /// <summary>
  16. /// 自定义执行命令方法,注意传入的变量session类型为MySession
  17. /// </summary>
  18. /// <param name="session"></param>
  19. /// <param name="requestInfo"></param>
  20. public override void ExecuteCommand(MySession session, StringRequestInfo requestInfo)
  21. {
  22. session.Send("Hello World!");
  23. }
  24. }
  25. }

4.      修改Main方法代码

[csharp] view
plain
copyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using SuperSocket;
  6. using SuperSocket.Common;
  7. using SuperSocket.SocketBase;
  8. using SuperSocket.SocketEngine;
  9. using SuperSocket.SocketBase.Protocol;
  10. namespace SuperSocketApp1
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. var appServer = new MyServer();
  17. //服务器端口
  18. int port = 2000;
  19. //设置服务监听端口
  20. if (!appServer.Setup(port))
  21. {
  22. Console.WriteLine("端口设置失败!");
  23. Console.ReadKey();
  24. return;
  25. }
  26. //启动服务
  27. if (!appServer.Start())
  28. {
  29. Console.WriteLine("启动服务失败!");
  30. Console.ReadKey();
  31. return;
  32. }
  33. Console.WriteLine("启动服务成功,输入exit退出!");
  34. while (true)
  35. {
  36. var str = Console.ReadLine();
  37. if (str.ToLower().Equals("exit"))
  38. {
  39. break;
  40. }
  41. }
  42. Console.WriteLine();
  43. //停止服务
  44. appServer.Stop();
  45. Console.WriteLine("服务已停止,按任意键退出!");
  46. Console.ReadKey();
  47. }
  48. }
  49. }

5.      程序结构如图

6.      创建多服务器提供不同服务的方法:按照上面的过程,创建不同的AppServer 、AppSession子类、自定义命令,并在程序入口中启动。

7.      注意:

a) MyServer、自定义命令和MySession的访问权限必须设置为public

b) MyServer父类为AppServer<MySession>

c) MySession父类为AppSession<MySession>

d) HELLO父类为CommandBase<MySession,StringRequestInfo>,ExecueteCommand方法传入值类型分别为MySession和StringRequestInfo

e) 多服务器中需注意AppSession、AppServer、自定义命令中的AppSession不要搞错

//输出客户端IP地址

时间: 2024-11-03 03:40:54

SuperSocket服务器架设(三):在SuperSocket中自定义Command、AppServer和AppSession的相关文章

OSGI中自定义command(2)

OSGI中自定义command(2) 前文 在上一篇博文中,我们讲述了什么是OSGI中的command,同时写了一个简单的command,这个command实现了org.apache.felix.gogo.commands.Action这个接口,同样可以实现相同功能的还有 org.apache.karaf.shell.console.OsgiCommandSupport这一个抽象类,但是在本程序中,这两个接口或者抽象类上都标注了@Deprecated,因此已经不推荐使用了,而当前推荐使用的则是k

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

什么是AppSession? AppSession 代表一个和客户端的逻辑连接,基于连接的操作应该定于在该类之中.你可以用该类的实例发送数据到客户端,接收客户端发送的数据或者关闭连接.同时可以保存客户端所关联的数据. 什么是AppServer? AppServer 代表了监听客户端连接,承载TCP连接的服务器实例.理想情况下,我们可以通过AppServer实例获取任何你想要的客户端连接,服务器级别的操作和逻辑应该定义在此类之中. 第一步:创建你的AppSession 为什么要创建AppSessi

Android高手进阶教程(三)之----Android 中自定义View的应用.

大家好我们今天的教程是在Android 教程中自定义View 的学习,对于初学着来说,他们习惯了Android 传统的页面布局方式,如下代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertic

Linux与云计算——第二阶段 第三章:SSH服务器架设(上)openssh 基础

Linux与云计算--第二阶段Linux服务器架设 第三章:SSH服务器架设(上)openssh 基础 1.密码认证 配置SSH服务器以便远程主机连接访问 [1] 即使你在安装CentOS系统的时候选择了最小化安装,OpenSSH也会被默认安装,所以你不需要再安装任何额外的软件包来实现该功能.缺省情况下你可以通过密码实现远程访问,如果需要增强安全性,建议还是要修改部分配置. [[email protected] ~]# vim /etc/ssh/sshd_config # line 49:去掉备

MyEclipse中web服务器的三种配置方式

初学Javaweb开发的人们都会遇到一个问题,就是服务器环境的搭建配置问题.下面介绍三种服务器的搭建方式. 直接修改server.xml文件 当你写了一个web应用程序(jsp/servlet),想通过浏览器直接去访问这个页面,需要在Tomcat中配置相关路径: 找到Tomcat下conf目录,你会看到有个server.xml,即服务器配置文件.用文本编译器打开,拉到Host标签,在它结束前加上我们的应用程序路径: <Context path="/HelloWeb" docBas

Linux与云计算——第二阶段 第三章:SSH服务器架设(下)openssh 进阶

Linux与云计算--第二阶段Linux服务器架设 第三章:SSH服务器架设(下)openssh 进阶 5.SFTP+Chroot 配置SFTP only + Chroot. 给一些用户限制他们只允许SFTP访问特定的目录. [1] 例如, 设置 /home 作为Chroot目录. # 为SFTP创建一个组 [[email protected] ~]# groupadd sftp_users # 限制只有用户"user"可以使用SFTP [[email protected] ~]# u

Android中自定义样式与View的构造函数中的第三个参数defStyle的意义

零.序 系统自带的View可以在xml中配置属性,对于写的好的Custom View同样可以在xml中配置属性,为了使自定义的View的属性可以在xml中配置,需要以下4个步骤: 通过<declare-styleable>为自定义View添加属性 在xml中为相应的属性声明属性值 在运行时(一般为构造函数)获取属性值 将获取到的属性值应用到View 怎么将获取到的属性值应用到View就不用说了,自己定义的属性什么用处自己肯定是清楚的,所以接下来看一下前三点. 一.自定义Style 通过<

[转]Android中自定义样式与View的构造函数中的第三个参数defStyle的意义

转自:http://www.cnblogs.com/angeldevil/p/3479431.html Android中自定义样式与View的构造函数中的第三个参数defStyle的意义 零.序 一.自定义Style 二.在XML中为属性声明属性值 1. 在layout中定义属性 2. 设置Style 3. 通过Theme指定 三.在运行时获取属性值 1. View的第三个构造函数的第三个参数defStyle 2. obtailStyledAttributes 3. Example 四.结论与代

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

在上一篇文章中,我们已经了解到了如何在SuperSocket处理客户端请求. 同时我们可能会发现一个问题,如果我们的服务器端包含有很多复杂的业务逻辑,这样的switch/case代码将会很长而且非常难看,并且没有遵循面向对象设计的原则(OOD). 在这种情况下,SuperSocket提供了一些让我们在多个独立的类中处理各自不同的请求的命令框架,接下来我们一起来看一下怎么使用 1.自定义AppSession AppSession 代表一个和客户端的逻辑连接,基于连接的操作应该放在该类之中.你可以用