背景:我们都知道,在Socket编程中,需要关注和监控Server端和Client端的启动、连接等事件。那在SuperSocket中是怎样去实现呢,本文进行实例介绍,通过重写扩展自定义的AppSession和SuperSocketService
概念:在SuperSocket中,一个Session就代表一个客户端的连接,对客户端的管理、连接、监控事件都在AppSession相关方法中去实现;
一、编写自定义的AppSession
public class MySession : AppSession
{
protected override ValueTask OnSessionClosedAsync(CloseEventArgs e)
{
Console.WriteLine("客户端关闭连接");
return base.OnSessionClosedAsync(e);
}
protected override ValueTask OnSessionConnectedAsync()
{
Console.WriteLine("客户端连接成功");
return base.OnSessionConnectedAsync();
}
}
然后在SuperSocketHostBuilder创建时指定:
SuperSocketHostBuilder.Create<MyPackage, MyFilter>()
.UseSession<MySession>();
二、编写自定义的SuperSocketService
public class MyService<MyPackage> : SuperSocketService<MyPackage>
{
public MyService(IServiceProvider serviceProvider, IOptions<ServerOptions> serverOptions)
: base(serviceProvider, serverOptions)
{
}
protected override void OnNewClientAccept(IChannelCreator listener, IChannel channel)
{
Console.WriteLine("新客户端想要连接:" + listener.Options.Ip + ":" + listener.Options.Port);
base.OnNewClientAccept(listener, channel);
}
protected override ValueTask OnSessionClosedAsync(IAppSession session, CloseEventArgs e)
{
Console.WriteLine("客户端断开连接:" + session.RemoteEndPoint);
return base.OnSessionClosedAsync(session, e);
}
protected override ValueTask OnSessionConnectedAsync(IAppSession session)
{
Console.WriteLine("客户端连接成功:" + session.RemoteEndPoint);
return base.OnSessionConnectedAsync(session);
}
protected override ValueTask<bool> OnSessionErrorAsync(IAppSession session, PackageHandlingException<MyPackage> exception)
{
Console.WriteLine("客户端错误:" + session.RemoteEndPoint + " Error:" + exception.Message);
return base.OnSessionErrorAsync(session, exception);
}
protected override ValueTask OnStartedAsync()
{
Console.WriteLine("Service已启动...");
return base.OnStartedAsync();
}
protected override ValueTask OnStopAsync()
{
Console.WriteLine("Service已关闭...");
return base.OnStopAsync();
}
}
总结:这块其实没有复杂的地方,以及应用场景也是针对多客户端的连接成功,断开连接去处理,以及维护你的业务中Session字典。看情况去使用