一个Telnet示例

    • 创建一个控制台应用程序项目。 由于控制台应用程序项目的默认目标框架是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需要的

    • 注册回话新建事件处理方法
    • 在事件处理代码中发送欢迎信息给客户端
    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. static void appServer_NewRequestReceived(AppSession session, StringRequestInfo requestInfo)
    2. {
    3. {
    4. case("ECHO"):
    5. session.Send(requestInfo.Body);
    6. break;
    7. case ("ADD"):
    8. session.Send(requestInfo.Parameters.Select(p => Convert.ToInt32(p)).Sum().ToString());
    9. break;
    10. case ("MULT"):
    11. var result = 1;
    12. foreach (var factor in requestInfo.Parameters.Select(p => Convert.ToInt32(p)))
    13. {
    14. result *= factor;
    15. }
    16. session.Send(result.ToString());
    17. break;
    18. }
    19. }

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

    • 通过Telnet客户端进行测试

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

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

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

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

    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. appServer.NewRequestReceived += new RequestHandler<AppSession, StringRequestInfo>(appServer_NewRequestReceived);