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

【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://www.xdnf.cn/news/19945.html

相关文章:

  • [光学原理与应用-402]:设计 - 深紫外皮秒脉冲激光器 - 元件 - AOM零级光与一级光:深紫外皮秒激光器中的核心光学特性与系统应用
  • 决策树算法详解:从原理到实战
  • RabbitMq如何实现幂等性
  • 力扣字符串刷题-六道题记录-1
  • ECMAScript (5)ES6前端开发核心:国际化与格式化、内存管理与性能
  • Lucene 8.7.0 版本的索引文件格式
  • uniapp vue页面传参到webview.nvue页面的html或者另一vue中
  • 架构-亿级流量性能调优实践
  • 【ICCV 2025 顶会论文】,新突破!卷积化自注意力 ConvAttn 模块,即插即用,显著降低计算量和内存开销。
  • 阿里云轻量应用服务器部署-WooCommerce
  • 剧本杀APP系统开发:引领娱乐行业新潮流的科技力量
  • 【RNN-LSTM-GRU】第三篇 LSTM门控机制详解:告别梯度消失,让神经网络拥有长期记忆
  • 【已更新文章+代码】2025数学建模国赛A题思路代码文章高教社杯全国大学生数学建模-烟幕干扰弹的投放策略
  • 达梦数据库-字典缓冲区 (二)-v2
  • void*指针类型转换笔记
  • C++ const以及相关关键字
  • Ubuntu 25.04搭建hadoop3.4.1集群详细教程
  • Access开发导出PDF的N种姿势,你get了吗?
  • 开源本地LLM推理引擎(Cortex AI)
  • OpenTenBase vs MySQL vs Oracle,企业级应用数据库实盘对比分析
  • 使用国外网络的核心问题有哪些?
  • 基于 epoll 的高并发服务器原理与实现(对比 select 和 poll)
  • 十七、单线程 Web 服务器
  • (自用)PowerShell常用命令自查文档
  • AI重构出海营销:HeadAI如何用“滴滴模式”破解红人营销效率困局?
  • Flink 网络消息队列 PrioritizedDeque
  • C52单片机独立按键模块,中断系统,定时器计数器以及蜂鸣器
  • OpenLayers常用控件 -- 章节三:鼠标位置坐标显示控件教程
  • 多线程入门到精通系列: 从操作系统到 Java 线程模型
  • 快鹭云业财一体化系统技术解析:低代码+AI如何破解数据孤岛难题