SuperSocket 1.5 Documentation译文 1 ----- 一个Telnet示例
创建一个控制台项目,并添加引用SuperSocket
- 创建一个“控制台应用程序”项目。创建项目后,你应该根据“客户端配置文件”改变这个项目的目标framework。因为这样应用程序将会作为Server运行并且“客户端配置文件”不用编译
- 添加项目引用(SuperSocket.Common.dll, SuperSocket.SocketBase.dll, SuperSocket.SocketEngine.dll)
- 添加 log4net.dll 到项目引用,因为SuerSocket用 它作为默认的日志框架
- log4net.config配置包含在SuperSocket所提供的项目文件夹中的“Config”,并设置它的生成操作为“内容”并且将引用“复制到输出目录”(复制本地=true)
启动或停止服务器代码
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(); }
处理传入的连接
-
注册新连接的会话事件处理程序
appServer.NewSessionConnected += new SessionHandler<AppSession>(appServer_NewSessionConnected);
-
在处理程序中,客户端发送欢迎消息
static void appServer_NewSessionConnected(AppSession session) { session.Send("Welcome to SuperSocket Telnet Server"); }
-
通过Telnet客户端测试
- 打开一个Telnet客户端
- 链接到 ip:127.0.0.1 port:2012
- 你会看到“欢迎来到SuperSocket Telnet服务器”的消息
处理请求
-
注册请求处理程序
appServer.NewRequestReceived += new RequestHandler<AppSession, StringRequestInfo>(appServer_NewRequestReceived);
-
执行请求的处理程序
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
-
通过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);