Fork me on GitHub

SuperSocket 1.5 Documentation译文 1 ----- 一个Telnet示例

创建一个控制台项目,并添加引用SuperSocket

  1. 创建一个“控制台应用程序”项目。创建项目后,你应该根据“客户端配置文件”改变这个项目的目标framework。因为这样应用程序将会作为Server运行并且“客户端配置文件”不用编译
  2. 添加项目引用(SuperSocket.Common.dll, SuperSocket.SocketBase.dll, SuperSocket.SocketEngine.dll)
  3. 添加 log4net.dll 到项目引用,因为SuerSocket用 它作为默认的日志框架
  4. log4net.config配置包含在SuperSocket所提供的项目文件夹中的“Config”,并设置它的生成操作为“内容”并且将引用“复制到输出目录”(复制本地=true)

      Telnet Project

启动或停止服务器代码

static void Main(string[] args)
{
    Console.WriteLine("Press any key to start the server!");

    Console.ReadKey();
    Console.WriteLine();

    var appServer = new AppServer();

    //设置应用程序服务器
    if (!appServer.Setup(2012)) //Setup with listening port
    {
        Console.WriteLine("Failed to setup!");
        Console.ReadKey();
        return;
    }

    Console.WriteLine();

    //尝试启动应用程序服务器
    if (!appServer.Start())
    {
        Console.WriteLine("Failed to start!");
        Console.ReadKey();
        return;
    }

    Console.WriteLine("The server started successfully, press key 'q' to stop it!");

    while (Console.ReadKey().KeyChar != 'q')
    {
        Console.WriteLine();
        continue;
    }

    //停止应用程序服务器
    appServer.Stop();

    Console.WriteLine("The server was stopped!");
    Console.ReadKey();
}

 

处理传入的连接

  1. 注册新连接的会话事件处理程序

    appServer.NewSessionConnected += new SessionHandler<AppSession>(appServer_NewSessionConnected);

     

  2. 在处理程序中,客户端发送欢迎消息

    static void appServer_NewSessionConnected(AppSession session)
    {
        session.Send("Welcome to SuperSocket Telnet Server");
    }

     

  3. 通过Telnet客户端测试

    1. 打开一个Telnet客户端
    2. 链接到 ip:127.0.0.1 port:2012
    3. 你会看到“欢迎来到SuperSocket Telnet服务器”的消息

处理请求

  1. 注册请求处理程序

    appServer.NewRequestReceived += new RequestHandler<AppSession, StringRequestInfo>(appServer_NewRequestReceived);

     

  2. 执行请求的处理程序

    static void appServer_NewRequestReceived(AppSession session, StringRequestInfo requestInfo)
    {
        switch (requestInfo.Key.ToUpper())
        {
            case("ECHO"):
                session.Send(requestInfo.Body);
                break;
    
            case ("ADD"):
                session.Send(requestInfo.Parameters.Select(p => Convert.ToInt32(p)).Sum().ToString());
                break;
    
            case ("MULT"):
    
                var result = 1;
    
                foreach (var factor in requestInfo.Parameters.Select(p => Convert.ToInt32(p)))
                {
                    result *= factor;
                }
    
                session.Send(result.ToString());
                break;
        }
    }

     

    客户端发送数据的格式以空格分隔,第一部分是 requestInfo.Key ,第二部分是 requestInfo.Parameters

  3. 通过Telnet客户端测试

    您可以打开一个telnet客户端来验证上面的代码。

    在你连接到服务器之后,您就可以像下面这样与服务器进行交互(“C:”表示客户端的请求,“S:”代表服务器的响应 )

    C: ECHO ABCDEF
    S: ABCDEF
    C: ADD 1 2
    S: 3
    C: ADD 250 250
    S: 500
    C: MULT 2 8
    S: 16
    C: MULT 125 2
    S: 250

     

命令的用法

在前面的部分中,您已经看到了如何处理客户端的请求SuperSocket。但在同时,你可能已经发现了一个问题,如果你的服务端有复杂的业务逻辑,那么switch case会很多而且不符合OOD原则,在这种情况下,SuperSocket允许定义独立的类来处理不同类型的请求的命令。

例如,你可以定义一个名为“ADD”的类,用来处理requestInfo的关键字是“ADD”的请求:

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

 

再定义一个命名为“MULT”的类,用来处理requestInfo的关键字等于“MULT”的请求:

public class MULT : CommandBase<AppSession, StringRequestInfo>
{
    public override void ExecuteCommand(AppSession session, StringRequestInfo requestInfo)
    {
        var result = 1;

        foreach (var factor in requestInfo.Parameters.Select(p => Convert.ToInt32(p)))
        {
            result *= factor;
        }

        session.Send(result.ToString());
    }
}

 

同时,你还需要删除定义reqauest的处理程序,因为请求处理程序和命令不能一起工作:

//移除这一行
appServer.NewRequestReceived += new RequestHandler<AppSession, StringRequestInfo>(appServer_NewRequestReceived);

 

posted @ 2013-01-16 21:31  逗豆豆  阅读(1167)  评论(4编辑  收藏  举报