一个Telnet示例

关键字: Telnet, 控制台示例, 创建项目,启动服务,停止服务,处理连接,处理请求

创建一个控制台项目然后引用SuperSocket

  • 创建一个控制台应用程序项目。 由于控制台应用程序项目的默认目标框架是Client Profile (.Net 3.5, .Net 4.0), 但SuperSocket需要使用完整的框架,所以当项目创建好之后,你要将项目的目标框架改成完整的框架。
  • 添加SuperSocket的dll文件(SuperSocket.Common.dll, SuperSocket.SocketBase.dll, SuperSocket.SocketEngine.dll)到此项目的引用。
  • 添加log4net.dll到项目引用。 如果是你使用默认的日志框架(log4net),此步骤是必须的。
  • 引用SuperSocket提供的日志配置文件log4net.config到项目文件夹的"Config"文件夹然后设置它的Build Action 为 "Content",设置它的Copy to Output Directory 为 "Copy if newer",因为这个配置文件是log4net需要的

Telnet Project

服务器启动和停止代码

  1. static void Main(string[] args)
  2. {
  3. Console.WriteLine("Press any key to start the server!");
  4. Console.ReadKey();
  5. Console.WriteLine();
  6. var appServer = new AppServer();
  7. //Setup the appServer
  8. if (!appServer.Setup(2012)) //Setup with listening port
  9. {
  10. Console.WriteLine("Failed to setup!");
  11. Console.ReadKey();
  12. return;
  13. }
  14. Console.WriteLine();
  15. //Try to start the appServer
  16. if (!appServer.Start())
  17. {
  18. Console.WriteLine("Failed to start!");
  19. Console.ReadKey();
  20. return;
  21. }
  22. Console.WriteLine("The server started successfully, press key 'q' to stop it!");
  23. while (Console.ReadKey().KeyChar != 'q')
  24. {
  25. Console.WriteLine();
  26. continue;
  27. }
  28. //Stop the appServer
  29. appServer.Stop();
  30. Console.WriteLine("The server was stopped!");
  31. Console.ReadKey();
  32. }

处理连接

  • 注册回话新建事件处理方法
  1. appServer.NewSessionConnected += new SessionHandler<AppSession>(appServer_NewSessionConnected);
  • 在事件处理代码中发送欢迎信息给客户端
  1. static void appServer_NewSessionConnected(AppSession session)
  2. {
  3. session.Send("Welcome to SuperSocket Telnet Server");
  4. }
  • 使用Telnet客户端进行测试

    • open a telnet client
    • type "telnet localhost 2012" ending with an "ENTER"
    • you will get the message "Welcome to SuperSocket Telnet Server"

处理请求

  • 注册请求处理方法
  1. appServer.NewRequestReceived += new RequestHandler<AppSession, StringRequestInfo>(appServer_NewRequestReceived);
  • 实现请求处理
  1. static void appServer_NewRequestReceived(AppSession session, StringRequestInfo requestInfo)
  2. {
  3. switch (requestInfo.Key.ToUpper())
  4. {
  5. case("ECHO"):
  6. session.Send(requestInfo.Body);
  7. break;
  8. case ("ADD"):
  9. session.Send(requestInfo.Parameters.Select(p => Convert.ToInt32(p)).Sum().ToString());
  10. break;
  11. case ("MULT"):
  12. var result = 1;
  13. foreach (var factor in requestInfo.Parameters.Select(p => Convert.ToInt32(p)))
  14. {
  15. result *= factor;
  16. }
  17. session.Send(result.ToString());
  18. break;
  19. }
  20. }

requestInfo.Key 是请求的命令行用空格分隔开的第一部分

requestInfo.Parameters 是用空格分隔开的其余部分

  • 通过Telnet客户端进行测试

你可以打开telnet客户端去验证以上代码。

当然和服务器端建立连接之后,你可以通过下面的方式与服务器端交互("C:"之后的信息代表客户端的请求,"S:"之后的信息代表服务器端的响应):

  1. C: ECHO ABCDEF
  2. S: ABCDEF
  3. C: ADD 1 2
  4. S: 3
  5. C: ADD 250 250
  6. S: 500
  7. C: MULT 2 8
  8. S: 16
  9. C: MULT 125 2
  10. S: 250

Command的用法

在本文档的前半部分,你可能已经了解到了如何在SuperSocket处理客户端请求。 但是同时你可能会发现一个问题,如果你的服务器端包含有很多复杂的业务逻辑,这样的switch/case代码将会很长而且非常难看,并且没有遵循OOD的原则。在这种情况下,SuperSocket提供了一个让你在多个独立的类中处理各自不同的请求的命令框架。

例如,你可以定义一个名为"ADD"的类去处理Key为"ADD"的请求:

  1. public class ADD : CommandBase<AppSession, StringRequestInfo>
  2. {
  3. public override void ExecuteCommand(AppSession session, StringRequestInfo requestInfo)
  4. {
  5. session.Send(requestInfo.Parameters.Select(p => Convert.ToInt32(p)).Sum().ToString());
  6. }
  7. }

定义一个名为"MULT"的类去处理Key为"MULT"的请求:

  1. public class MULT : CommandBase<AppSession, StringRequestInfo>
  2. {
  3. public override void ExecuteCommand(AppSession session, StringRequestInfo requestInfo)
  4. {
  5. var result = 1;
  6. foreach (var factor in requestInfo.Parameters.Select(p => Convert.ToInt32(p)))
  7. {
  8. result *= factor;
  9. }
  10. session.Send(result.ToString());
  11. }
  12. }

同时你要移除请求处理方法的注册,因为它和命令不能同时被支持:

  1. //Remove this line
  2. appServer.NewRequestReceived += new RequestHandler<AppSession, StringRequestInfo>(appServer_NewRequestReceived);