SuperSocket 2.0 SuperSocket.Client 的使用
SuperSocket 2.0 SuperSocket.Client 的使用
一、关于报文结构
我们使用的报文结构来自于 SuperSocket 自带的 StringPackageInfo,
public class StringPackageInfo : IKeyedPackageInfo<string>, IStringPackage
{
public string Key { get; set; }
public string Body { get; set; }
public string[] Parameters { get; set; }
}
在 SuperSocket 中,你可以使用空格分隔相关的参数,如 "ADD 1 2" 表示的意思是 Key 为 "ADD",而 Body 和 Parameters 是除了 Key 之外后面参数的两种形式。

你可以看到服务端解析得到的结构,Body 和 Parameters 只是两种不同的形式。
二、分段标记
在 SuperSocket 使用 CommandLinePipelineFilter 就需要满足在报文末尾加入 0D 0A(\r\n也就是Environment.NewLine)作为分段标记,这样解析器才能解析出有效信息的内容,如果没有携带上这个信息,很大程度上服务器不会有任何反应。
三、从 SuperSocket 教程中开启一个 Telnet 简单的服务端并用 Sokit 进行通信测试
你可以在 https://docs.supersocket.net/v2-0/zh-CN/A-Telnet-Example 找到以下示例。
总之你可以以某些方式启动对应的服务器,它对应的端口号为 4040,我进行了一些更改。
总之无论你发送什么消息,它返回的都是 ADD 1 2 这行信息。
var host = SuperSocketHostBuilder
.Create<StringPackageInfo, CommandLinePipelineFilter>()
.UsePackageHandler(async (session, package) =>
{
await session.SendAsync(Encoding.UTF8.GetBytes($"{package.Key}ADD 1 2" + Environment.NewLine));
})
.ConfigureSuperSocket(options =>
{
options.Name = "Echo Server";
options.Listeners = [
new ListenOptions
{
Ip = "Any",
Port = 4040
}];
}).Build();
await host.RunAsync();
我使用的 TCP 测试工具是 sokit,我们可以将服务器开启后,就可以实现调试了。

四、使用 SuperSocket.Client 2.0+ 进行客户端交互
<PackageReference Include="SuperSocket.Client" Version="2.0.1" />
在开始 SuperSocket 的客户端通信之前,请先在 NuGet 上准备上面的依赖。
客户端的代码你可以参考这个:
var easyClient = new EasyClient<StringPackageInfo>(new CommandLinePipelineFilter()
{
Decoder = new DefaultStringPackageDecoder()
});
var client = easyClient.AsClient();
var ipAddress = IPAddress.Loopback;
var port = 4040;
var ipEndPoint = new IPEndPoint(ipAddress, port);
await client.ConnectAsync(ipEndPoint);
var message = new StringPackageInfo()
{
Key = "GREET",
Parameters = ["1", "2"]
};
var messageStr = $"{message.Key} {string.Join(',', message.Parameters)}{Environment.NewLine}";
var messageBytes = Encoding.UTF8.GetBytes(messageStr);
await client.SendAsync(messageBytes);
var receivedPack = await client.ReceiveAsync();
Console.WriteLine($"{receivedPack.Key} {receivedPack.Body}");
我们使用 sokit 开启服务端作为模拟,sokit 开启服务器模式,ip 127.0.0.1 端口是 4040(因为上面代码绑定的也是这个)

其中调试的结果就是这样的。
五、【完整代码】在单个进程的多个线程中分别开启服务端和客户端的结果

你需要通过回车来换新的一行。
public class Program
{
static async Task StartServer()
{
var host = SuperSocketHostBuilder
.Create<StringPackageInfo, CommandLinePipelineFilter>()
.UsePackageHandler(async (session, package) =>
{
await session.SendAsync(Encoding.UTF8.GetBytes($"{package.Key}ADD 1 2" + Environment.NewLine));
})
.ConfigureSuperSocket(options =>
{
options.Name = "Echo Server";
options.Listeners = [
new ListenOptions
{
Ip = "Any",
Port = 4040
}];
}).Build();
await host.RunAsync();
}
static async Task StartClient()
{
var easyClient = new EasyClient<StringPackageInfo>(new CommandLinePipelineFilter()
{
Decoder = new DefaultStringPackageDecoder()
});
var client = easyClient.AsClient();
var ipAddress = IPAddress.Loopback;
var port = 4040;
var ipEndPoint = new IPEndPoint(ipAddress, port);
await client.ConnectAsync(ipEndPoint);
var message = new StringPackageInfo()
{
Key = "GREET",
Parameters = ["1", "2"]
};
var messageStr = $"{message.Key} {string.Join(' ', message.Parameters)}{Environment.NewLine}";
var messageBytes = Encoding.UTF8.GetBytes(messageStr);
await client.SendAsync(messageBytes);
var receivedPack = await client.ReceiveAsync();
Console.WriteLine($"{receivedPack.Key} {receivedPack.Body}");
}
static async Task Main(string[] args)
{
Task.Run(StartServer);
while (true)
{
Console.ReadLine();
await StartClient();
}
Console.ReadKey();
}
}

浙公网安备 33010602011771号