【SuperSocket 】SuperSocket 中自定义 Session
在 SuperSocket 中自定义 Session
SuperSocket 是一个高性能、可扩展的 .NET Socket 服务器框架。它的核心设计之一就是 Session(会话),用于表示与客户端的一次连接。
在默认情况下,SuperSocket 使用 AppSession
作为会话对象。但在实际业务中,我们往往需要在 Session
中存储更多上下文信息,比如:
- 用户 ID / 登录状态
- 业务数据缓存
- 会话级别的统计信息(消息数量、心跳时间等)
这时候,就需要 自定义 Session。
一、Session 的基础
默认的 Session 类型是 AppSession
:
public class AppSession : IAppSession
{public string SessionID { get; }public IConnection Connection { get; }public ValueTask SendAsync(ReadOnlyMemory<byte> data) { ... }public virtual ValueTask OnSessionConnectedAsync() { ... }public virtual ValueTask OnSessionClosedAsync(EventArgs e) { ... }
}
每当有新的客户端连接,SuperSocket 就会创建一个新的 AppSession
实例,代表该连接。
二、为什么要自定义 Session?
举个例子,如果我们在聊天系统中,需要知道 哪个用户对应哪个 Session,那么就需要给 Session 加上用户信息:
public class MySession : AppSession
{// 扩展属性public string UserId { get; set; }// 重写连接事件protected override ValueTask OnSessionConnectedAsync(){Console.WriteLine($"新连接建立: {SessionID}");return base.OnSessionConnectedAsync();}protected override ValueTask OnSessionClosedAsync(EventArgs e){Console.WriteLine($"连接关闭: {SessionID}");return base.OnSessionClosedAsync(e);}
}
三、如何让 SuperSocket 使用自定义 Session?
SuperSocket 并不会自动使用 MySession
,它默认用 AppSession
。
所以我们需要告诉框架:新会话请用我自定义的 MySession
来创建。
这就要用到 ISessionFactory
。
public class MySessionFactory : ISessionFactory
{public Type SessionType => typeof(MySession);public IAppSession Create(){return new MySession();}
}
然后在启动时注册:
services.AddSingleton<ISessionFactory, MySessionFactory>();
这样,SuperSocket 每次有新连接时,都会调用 MySessionFactory.Create()
,从而生成 MySession
。
四、最佳实践:管理所有在线 Session
有了自定义 Session,我们可以轻松实现全局管理,比如存储所有在线用户:
public class MySession : AppSession
{public static ConcurrentDictionary<string, MySession> Sessions = new();public string UserId { get; set; }protected override ValueTask OnSessionConnectedAsync(){Sessions.TryAdd(SessionID, this);Console.WriteLine($"新连接 {SessionID} 已加入,当前在线数: {Sessions.Count}");return default;}protected override ValueTask OnSessionClosedAsync(EventArgs e){Sessions.TryRemove(SessionID, out _);Console.WriteLine($"连接 {SessionID} 已移除,当前在线数: {Sessions.Count}");return default;}
}
这样你就能在任何地方调用:
foreach (var session in MySession.Sessions.Values)
{await session.SendAsync(Encoding.UTF8.GetBytes("Hello Client!"));
}
实现广播或点对点消息发送。
五、总结
通过自定义 Session,我们就可以:
- 给连接存储更多业务数据(用户、状态、上下文)
- 在连接建立/关闭时执行逻辑(认证、日志、清理)
- 统一管理在线 Session,方便实现广播、点对点通信
关键点在于:
- 继承 AppSession → 写自己的
MySession
- 实现 ISessionFactory → 告诉框架用哪个 Session
- 注册到 DI →
services.AddSingleton<ISessionFactory, MySessionFactory>()
这样,SuperSocket 就会把 Session 生命周期交给我们,真正做到 框架负责网络通信,我们专注业务逻辑。