说到socket,我们常见的处理方法是使用Socket组件自己去定义监听和处理,如果是在代码量较小的情况下面,使用这种方式可能会得心应手,但是如果遇到大的项目就显得有点力不从心了。这里博主则推荐一款.Net环境下的Socket框架,可以非常便捷的创建一个高可用,高并发的服务系统。
官方网站
SuperSocket
首先需要下载项目组件:
SuperSocket dll
,因为官网的链接较慢,故放到了百度云盘,如果需要最新版,则可自行去官网下载。
Socket调试工具:
SocketTools
我们下载完毕之后,找到需要引用的组件:log4net.dll,Newtonsoft.Json.dll,SuperSocket.Common,SuperSocket.SocketBase,SuperSocket.SocketEngine添加至项目。
打开Program编写如下代码:
static void Main(string[] args)
{
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();
}
1、AppServer即为一个Socket监听对象,AppServer实例的Setup为设置监听端口,调用Setup方法时,组件会检测端口是否被占用,如果被占用则会返回False。
2、调用Setup方法只进行端口占用检测,而不会启动服务,当端口检测校验通过后,需要调用Start方法,Start方法会返回监听是否启动成功。
3、完成以上步骤,则创建了一个简单的SuperSocket实例。
当我们完成了一系列的初始化工作后,我们就需要对组件的相关事件进行封装,如客户端连接,断开,接受数据事件,这时候我们就可以通过appServer进行创建:
appServer.NewSessionConnected += appServer_NewSessionConnected;
appServer.SessionClosed += appServer_SessionClosed;
appServer.NewRequestReceived += appServer_NewRequestReceived;
static void appServer_NewRequestReceived(AppSession session, SuperSocket.SocketBase.Protocol.StringRequestInfo requestInfo)
{
throw new NotImplementedException();
}
static void appServer_SessionClosed(AppSession session, CloseReason value)
{
throw new NotImplementedException();
}
static void appServer_NewSessionConnected(AppSession session)
{
throw new NotImplementedException();
}
NewSessionConnected
客户端连接
SessionClosed
客户端关闭
NewRequestReceived
客户端发送的数据
在SuperSocket中,监听服务即为AppServer,一个客户端连接为Session,AppServer和Session都可以自己高度定义和创建,将会在后面环节讲解。
首先,我们在
NewSessionConnected
中输出一个操作:
static void appServer_NewSessionConnected(AppSession session)
{
Console.WriteLine("Session:" + session.RemoteEndPoint + " connect");
}
我们就可以看到在客户端连接后这个事件即被触发,反之关闭事件的提示也是如此。
因为Socket数据传输是一整条流数据,不同于Web类可以指定头部,字段然后后台对应读取,所以需要使用一套命令行协议来进行数据交换工作。SuperSocket默认使用的是
Cmd的命令行模式,列如 ADD A A \r\n,ADD即为命令头,A A为命令参数,\r\n截止符(表示这段数据的截止位),那我们就可以用这套协议上手一个简单的示例。
static void appServer_NewRequestReceived(AppSession session, SuperSocket.SocketBase.Protocol.StringRequestInfo requestInfo)
{
var key = requestInfo.Key;
var body = requestInfo.Body;
switch(key)
{
case "1":
Console.WriteLine("hello word");
break;
case "2":
Console.WriteLine("LOL");
break;
case "3":
Console.WriteLine(body);
break;
}
}
默认协议需要换行符,没有换行符则无法处理!
某些情况下面,我们接收到数据处理后需要返回给客户端,则需要使用Session的Send方法进行数据发送,示例:
static void appServer_NewRequestReceived(AppSession session, SuperSocket.SocketBase.Protocol.StringRequestInfo requestInfo)
{
var key = requestInfo.Key;
var body = requestInfo.Body;
switch(key)
{
case "1":
Console.WriteLine("hello word");
break;
case "2":
Console.WriteLine("LOL");
break;
case "3":
Console.WriteLine(body);
session.Send(body);
break;
}
}
当key为3时,返回客户端发送的数据。
第一期教程就到这里结束,有问题可以加群153373508探讨。