在上一个教程我们建立了客户端和服务端的连接
接下来我们进行添砖加瓦
让程序变得越来越厉害
先认识一下Super Socket里的session
当客户端连接后会生成一个session对象
广发给Appsession类的解释是
AppServer basic class for whose request infoe type is StringRequestInfo(其请求信息类型为StringRequestInfo的AppServer基类)
这个是基类 说明可以继承,但是那个后面再讲
教程一中
这行代码只是拿到了与客户端的对话信息
并没有拿到客户端发送过来的信息
所以会说返回 这其实是一个异常信息
聪明的小伙伴这个时候就可以想到
我们需要去建立一个委托去处理这个信息才行
那么首先得拿到这个信息哦 怎么拿到?
void RequestHandler<TAppSession, TRequestInfo>(TAppSession session, TRequestInfo requestInfo)
那就是RequestHandler
这个委托就是SuperSocket用来做这件事情的
那么我们在上一次的基础上加点代码
requestInfo就是客户端发送过来的信息的包装类
想深入的也可以看看这个类里面有什么
当然 思路别乱 请手动忽略
现在可以不用看 我们只需要知道它有客户端发来的请求就可以了
那么加上了委托我们的客户端发送的信息就可以被处理了吗
当然这才成功了一小步
让我们启动服务端
使用客户端进行连接
发送ECHO hello My name is Client\r\n
服务端会回复hi my name is Server
主要是这里进行的返回操作
显然我发送其他信息
他就会给我回复 你奶奶的
它不让我们发 哈哈哈
当我们去掉ECHO字段
什么也不会回复了
为什么会这样
前面的字段就像一个协议
只有以ECHO 为开头的我才会去进行返回
不然不给 协议普遍存在于这个世界上
不然谁给我服务器发 我都去返回 那岂不是开销很大
当然 我们不仅仅只能发送ECHO
我们还能
做加法和乘法呢
我们以不同的协议告诉服务器我们该做什么
服务器就做什么返回给我们
这样就形成了一个完整的闭环
那肯定协议不止只有这三个呀
那么对于很多协议 SuperSocket该怎么去处理呢
那就要看下一个教程拉
先放上本教程的代码
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Socket
{
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<AppSession>(appServer_NewSessionConnected);
appServer.NewRequestReceived += new RequestHandler<AppSession, StringRequestInfo>(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();
}
/// <summary>
/// 对接收的数据进行处理
/// </summary>
/// <param name="session"></param>
/// <param name="requestInfo"></param>
private static void appServer_NewRequestReceived(AppSession session, StringRequestInfo requestInfo)
{
try
{
switch (requestInfo.Key.ToUpper())
{
case ("ECHO"):
if(requestInfo.Body.Contains("hello"))
session.Send("hi my name is Server");
else
session.Send("ninainaider");
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;
}
}
catch (Exception)
{
Console.WriteLine("异常");
}
}
static void appServer_NewSessionConnected(AppSession session)
{
session.Send("Welcome to SuperSocket Telnet Server");
}
}
}