在WPF中集成SuperSocket 2.0

本文在.Net5环境下,在WPF项目中集成SuperSocket(V2.0.0-beta.10),以便使WPF程序拥有Socket服务器能力。

本文假设读者具有在.Net5控制台程序中使用SuperSocket 2.0的能力,因此服务器相关设置不再介绍。

1、创建托管服务器主机

参考在.Net5控制台程序中使用SuperSocket 2.0,将其创建主机的代码复制过来即可。

public interface ISocketServerService
{
    void Startup();
    void Shutdown();
}

public class SocketServerService : ISocketServerService
{
    private readonly IHost _host;
    private readonly ILogService _logService;

    public SocketServerService(ILogService logService)
    {
        _logService = logService;

        //创建宿主:用Package类型和PipelineFilter类型创建SuperSocket宿主。
        _host = SuperSocketHostBuilder.Create<MyPackageInfo, MyPipelineFilter>()
            //注入Service
            .UseHostedService<MyService<MyPackageInfo>>()
            //注入Session
            .UseSession<MySession>()
            //注入命令
            .UseCommand((commandOptions) =>
            {
                commandOptions.AddCommand<MyCommand>(); //数据命令
            })
            //启用Session容器
            .UseInProcSessionContainer()
            //配置日志
            .ConfigureLogging((hostCtx, loggingBuilder) => { loggingBuilder.SetMinimumLevel(LogLevel.Warning); })
            .Build();
    }

    public void Startup()
    {
        try
        {
            _host.StartAsync().GetAwaiter();
        }
        catch (Exception e)
        {
            _logService.Error($"启动SocketServer失败:{e.Message}.");
        }
    }

    public void Shutdown()
    {
        try
        {
            _host.StopAsync().GetAwaiter().GetResult();
        }
        catch (Exception e)
        {
            _logService.Error($"关闭SocketServer失败:{e.Message}.");
        }
        finally
        {
            _host.Dispose();
        }
    }
}

2、添加配置文件appsettings.json

注意将其属性设置为:“生成操作”-“无”,“复制到输出目录”-“如果较新则复制”/”始终复制”。

下面的配置仅添加了IP和端口的参数作为示例。

{
  "serverOptions": {
    "name": "MyServer",
    "listeners": [
      {
        "ip": "Any",
        "port": "2021"
      }
    ]
  }
}

3、使用方法

ISocketServerService socketServerService = new SocketServerService(logService);
//启动Socket服务器
socketServerService.Startup();
//关闭Socket服务器
socketServerService.Shutdown();

4、注意事项

关闭Socket服务器时,如果不对IHost对象调用Dispose方法,SuperSocket不会真正关闭,导致WPF进程无法正常退出。

posted @ 2021-09-26 11:42  xhubobo  阅读(1059)  评论(0编辑  收藏  举报