官方文档
可以通过以下两种办法来获取SuperSocket。
我本人比较喜欢使用nuget来获取。【下文都用SS来表示Supersocket】
下面开始通过图文来建立第一个示例。
新建一个工程 打开vs新建一个创建一个控制台项目然后引用SuperSocket
1.新建一个项目后,就要引人Supersocket,在文章开头有说明两种获取SS的办法。第一种是去codeplex下载。这种形式的可以在项目的 References 上右键 Add References,然后引用对应的dll,这个参考下官方的文档介绍。
2.第二种通过nuget来获取SS,一些比较老版本的vs并没用自带nuget,需要自己去安装插件。如何安装请自行百度谷歌。在安装完成后,我们就可以通过nuget来获取SS。在输入框输入SuperSocket,然后选择第一个,点击install按钮来导入SS。后面根据提示来操作
导入SS后项目结构如下。
SS导入完成后,我们就可以按照官方文档来编写我们的第一个一个Telnet示例,注意命名空间的引用正确。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using SuperSocket.SocketBase;namespace TelnetDemo{ class Program { static void Main(string[] args) { Console.WriteLine("Press any key to start the server!"); Console.ReadKey(); Console.WriteLine(); var appServer = new AppServer(); //Setup the appServer if (!appServer.Setup(2012)) //Setup with listening port { Console.WriteLine("Failed to setup!"); Console.ReadKey(); return; } Console.WriteLine(); //Try to start the appServer 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; } //Stop the appServer appServer.Stop(); Console.WriteLine("The server was stopped!"); Console.ReadKey(); } }}
代码输入完成后,我们就运行来看看效果。
通过nuget导入SS的,我们运行会发现出现如下错误。
回去看下我们的项目结构,和对比下官方文档的项目结构。会发现少引用了SuperSocket.SocketEngine.dll导致的错误,那么我们手动引用,然后再一次运行,发现还是有一个错误。
这个错误因为引用的log4net和SS使用的log4net的版本不一致引起的,我们再次打开nuget包管理工具看一下。
在这里我们可以看到log4net的版本并不是最新的,我们可以选择版本和SS引用相同的,然后点击Upgrade来更新我们的log4net版本让我们的引用与SS一致。更新完成后,我们再一次运行代码。
这次运行成功,但是我们并不知道有运行成功,这需要引入一个日志来查看我们到底有启动成功。,其实有一个很简单的做法,如下图
这样再次编译运行,就可以看到我们的编译目录下多出了logs的日志文件夹。和一个log4net.config的配置文件。
然后我们可以打开Logs里面的文件来看看到底产生了什么样的信息。
[debug.log] 2015-09-25 00:09:13,807 [9] DEBUG AppServer-37121646 - Listener (0.0.0.0:2012) was started
[err.log] 是空的
[info.log] 2015-09-25 00:09:13,823 [9] INFO AppServer-37121646 - The server instance AppServer-37121646 has been started!
[perf.log] 是空的
从日志里面,我们可以看到服务器已经能启动成功,但是这还没有什么用,因为我们并没有处理客户的链接进来,处理客户的发送过来的信息。根据官方文档,我们继续拷贝代码来完善我们的程序。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using SuperSocket.SocketBase;using SuperSocket.SocketBase.Protocol;namespace TelnetDemo{ class Program { static void Main(string[] args) { Console.WriteLine("Press any key to start the server!"); Console.ReadKey(); Console.WriteLine(); var appServer = new AppServer(); appServer.NewSessionConnected += new SessionHandler(appServer_NewSessionConnected); appServer.NewRequestReceived += new RequestHandler (appServer_NewRequestReceived); //Setup the appServer if (!appServer.Setup(2012)) //Setup with listening port { Console.WriteLine("Failed to setup!"); Console.ReadKey(); return; } Console.WriteLine(); //Try to start the appServer 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; } //Stop the appServer appServer.Stop(); Console.WriteLine("The server was stopped!"); Console.ReadKey(); } static void appServer_NewSessionConnected(AppSession session) { session.Send("Welcome to SuperSocket Telnet Server"); } 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; } } }}
新代码如上面,再次运行完,服务器正常启动。然后我们测试能否正确的让客户端连接和接受客户的发送的数据。根据官网的介绍可以使用telnet来测试
这里提示*'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件。*是因为我们没有开启telnet。可以通过【控制面板】-》程序和功能-》启用或关闭windows功能。勾选Telnet客户的来启用。
再次回到cmd上来,输入文字 telnet localhost 2012,然后就可以看到屏幕上的欢迎信息。
然后我们可以输入我们的命令给服务器发送信息。
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
有的童鞋可能会用下面的这种工具来测试。
注意:默认的协议是以回车符号结束的
好了文章就到这里结束了,Command的用法自行理解,或者以后再细谈,本人水平和文笔有限,有错误的地方欢迎指正。