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();
    }
}
posted @ 2025-05-30 21:37  fanbal  阅读(456)  评论(0)    收藏  举报