当前位置: 首页 > news >正文

【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,我们就可以:

  1. 给连接存储更多业务数据(用户、状态、上下文)
  2. 在连接建立/关闭时执行逻辑(认证、日志、清理)
  3. 统一管理在线 Session,方便实现广播、点对点通信

关键点在于:

  • 继承 AppSession → 写自己的 MySession
  • 实现 ISessionFactory → 告诉框架用哪个 Session
  • 注册到 DIservices.AddSingleton<ISessionFactory, MySessionFactory>()

这样,SuperSocket 就会把 Session 生命周期交给我们,真正做到 框架负责网络通信,我们专注业务逻辑


文章转载自:

http://kOL2Zznk.jwdys.cn
http://iX7OlPKo.jwdys.cn
http://ifUocEKE.jwdys.cn
http://sbBI2fyV.jwdys.cn
http://Vpt7ea3e.jwdys.cn
http://GaPMifmC.jwdys.cn
http://6oc6yQJR.jwdys.cn
http://fi7TbtJz.jwdys.cn
http://jUwN3EE0.jwdys.cn
http://g3ZEIAoM.jwdys.cn
http://pzZuTPxa.jwdys.cn
http://un85jx8j.jwdys.cn
http://fFVuOMSR.jwdys.cn
http://WdWXof92.jwdys.cn
http://SY8AwgLh.jwdys.cn
http://cV4skb89.jwdys.cn
http://tDtkLGj0.jwdys.cn
http://OjQKlg50.jwdys.cn
http://7O2INBUW.jwdys.cn
http://w9KiSj9M.jwdys.cn
http://ZR9dfhqN.jwdys.cn
http://qMhmm0cY.jwdys.cn
http://06VHCzMP.jwdys.cn
http://bxg9rk1j.jwdys.cn
http://u1qIyTV0.jwdys.cn
http://iB2CkJzP.jwdys.cn
http://kMnTu7KI.jwdys.cn
http://WaQecTgk.jwdys.cn
http://iVFTa4Cl.jwdys.cn
http://tiEKFOfQ.jwdys.cn
http://www.dtcms.com/a/367667.html

相关文章:

  • 【涂鸦T5】6. lvgl显示光感数值
  • 【CS32L015C8T6】配置单片机PWM输出(内附完整代码及注释)
  • 华为校招实习留学生机试全攻略:真题目录+算法分类+在线OJ+备考策略
  • 【机器学习】HanLP+Weka+Java=Random Forest算法模型
  • Photoshop - Photoshop 触摸功能
  • Java Web :技术根基与产业实践的多维耦合
  • 在树莓派集群上部署 Distributed Llama (Qwen 3 14B) 详细指南
  • 解析PE文件的导入表和导出表
  • Flutter 3.35.2 以上版本中 数字转字符串的方法指南
  • 跨平台RTSP|RTMP|GB28181推拉流端智能录像模块技术探究
  • “人工智能+”的新范式:应用赋能与风险应对
  • 聚焦GISBox矢量服务:数据管理、数据库连接与框架预览全攻略
  • 如何避免 “空的 Windows 宿主机目录” 挂载时覆盖容器内的重要目录文件(导致容器关键文件丢失、无法启动)
  • wins中怎么用一个bat文件启动jar包和tomcat等多个服务
  • 深入理解awk
  • Leetcode 206. 反转链表 迭代/递归
  • RFID+工业互联网:汽车全景天幕全生命周期智能检测体系构建
  • javaweb基础第一天总结(HTML-CSS)
  • Django全局异常处理全攻略
  • 阵列信号处理之均匀面阵波束合成方向图的绘制与特点解读
  • 钉钉 AI 深度赋能制造业 LTC 全流程:以钉钉宜搭、Teambition 为例
  • JS对象进阶
  • 【109】基于51单片机自动感应迎宾门【Proteus仿真+Keil程序+报告+原理图】
  • 来自AI的背包系统
  • 【操作系统-Day 24】告别信号量噩梦:一文搞懂高级同步工具——管程 (Monitor)
  • 前端url参数拼接和提取
  • Qt 中添加并使用自定义 TTF 字体(以 Transformers Movie 字体为例)
  • 基于STM32的智能家居环境监控系统设计
  • 什么是静态住宅IP 跨境电商为什么要用静态住宅IP
  • 3 步搞定顶刊科研插图!用 GPT-5 反推提示词,Nano Banana 模型一键出图,附实操演示