# GameFrameX.SuperSocket
**Repository Path**: gameframex/GameFrameX.SuperSocket
## Basic Information
- **Project Name**: GameFrameX.SuperSocket
- **Description**: SuperSocket — lightweight, cross-platform, extensible socket server framework (GameFrameX mirror) | SuperSocket:轻量、跨平台、可扩展的 socket 服务框架(GameFrameX 镜像)
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-07-24
- **Last Updated**: 2026-09-14
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

# GameFrameX.SuperSocket
[](LICENSE)
[](https://www.nuget.org/packages/GameFrameX.SuperSocket.Server)
[](https://gameframex.doc.alianblank.com)
[](https://discord.gg/VDWUjWMDw9)
[](https://github.com/GameFrameX/gameframex)
[](https://www.bilibili.com/video/BV1yrpeepEn7)
[](https://gitee.com/GameFrameX/gameframex)
**独立游戏前后端一体化解决方案 · 独立游戏开发者的圆梦大使**
[文档](https://gameframex.doc.alianblank.com) · [快速开始](#快速开始) · QQ群: 467608841 / 233840761
[English](README.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [日本語](README.ja.md) | [한국어](README.ko.md)
## 项目简介
GameFrameX.SuperSocket 是 GameFrameX 维护的 [SuperSocket](https://github.com/kerryjiang/SuperSocket) 分支 —— 一个用纯 C# 编写的轻量级、可扩展的 socket 应用框架。你可以用它轻松构建始终保持连接的 socket 应用,无需关心如何使用 socket、如何维护 socket 连接以及 socket 的工作原理。
上游架构与公开 API 均保持不变,因此针对 SuperSocket 编写的项目依然可用。除此之外,本分支还承载了 GameFrameX 游戏服务器所需的改动:.NET 10 构建目标、DI/构造函数注入支持,以及面向弱网游戏流量的 KCP / ReliableSession 协议适配。
### 功能特性
- 轻量且可扩展 —— 无需手工管理 socket,即可构建始终保持连接的 socket 应用。
- 纯 C# 实现,可集成进任何现有 .NET 系统。
- 带管道过滤器与包解码器的协议解码管道。
- 默认传输为 TCP;UDP、KCP 与 ReliableSession 需显式启用。
- KCP 传输在 UDP 数据报之上提供可靠投递,具备重传与窗口控制。
- ReliableSession 协议帧契约与二进制编解码器,支持逻辑会话恢复、重放游标、确认区间、快照回退以及关闭/错误帧。
- 命令模式的请求处理。
- WebSocket 服务端与客户端,以及 Kestrel 集成。
- 对 DI / 构造函数注入友好的宿主构建器。
- .NET 10 构建目标。
## 快速开始
### 安装
从 NuGet.org 安装你需要的模块:
```bash
dotnet add package GameFrameX.SuperSocket.Server
dotnet add package GameFrameX.SuperSocket.ProtoBase
```
`Kcp` 与 `ReliableSession` 模块将随下个版本发布;在此之前,可从源码检出构建:
```bash
git clone https://github.com/GameFrameX/GameFrameX.SuperSocket.git
cd GameFrameX.SuperSocket
dotnet build GameFrameX.SuperSocket.slnx
```
在同一个源码检出中运行测试套件:
```bash
dotnet test GameFrameX.SuperSocket.slnx
dotnet test test/GameFrameX.SuperSocket.ReliableSession.Tests/GameFrameX.SuperSocket.ReliableSession.Tests.csproj
```
## 使用示例
### 传输选型
TCP 仍是默认传输。UDP、KCP 与 ReliableSession 需要显式选择:
| 选项 | 适用场景 | 当前行为 |
|:---|:---|:---|
| TCP | 需要标准的 SuperSocket 连接路径。 | 默认的服务端/客户端传输。 |
| 原生 UDP | 需要数据报投递,且能自行容忍丢包、重复与乱序。 | 通过 `UseUdp()` / `AsUdp(...)` 显式启用;不可靠的数据报传输。 |
| KCP | 需要在 UDP 数据报之上借助 KCP 的重传/窗口控制实现可靠投递。 | 通过 `UseKcp(...)` / `AsKcp(...)` 显式启用;不是 KCP-over-TCP。 |
| ReliableSession | 需要一套协议契约,覆盖逻辑会话恢复、重放游标、确认区间、快照回退以及关闭/错误帧。 | 仅提供协议模型与二进制编解码器。运行时心跳、恢复状态、重放缓存、去重缓存、适配器与业务投递在 C3 中尚未实现。 |
### 服务端:启用 KCP
引用 `GameFrameX.SuperSocket.Kcp`,保留你原有的包管道与处理器,然后在宿主构建器上添加
`UseKcp(...)`:
```csharp
using System.Text;
using GameFrameX.SuperSocket.Kcp;
using GameFrameX.SuperSocket.ProtoBase;
using GameFrameX.SuperSocket.Server.Host;
var builder = SuperSocketHostBuilder
.Create()
.UseKcp(options =>
{
// 未设置的可空选项保持 KCP 的内部默认值。
options.NoDelay = true;
options.NoDelayLevel = 1;
options.Interval = 10;
options.Resend = 2;
options.NoCongestionControl = true;
options.SendWindow = 512;
options.ReceiveWindow = 512;
options.MaxDatagramSize = 4096;
// 预期出现分钟级丢包黑洞时,请显式调高此项。
options.DeadLink = 120;
})
.UsePackageHandler(async (session, package) =>
{
// 与在 TCP 上一样处理解码后的 SuperSocket 包。
await session.SendAsync(Encoding.UTF8.GetBytes(package.Text + "\r\n"));
});
```
`UseKcp(...)` 会在尚未注册时注册 KCP 监听器/工厂与默认的进程内会话容器。默认的 KCP 服务端会话标识
由远端端点加上从入站 UDP 包中读取的 KCP `Conv` 共同构成。因此,仅靠 KCP 传输层并不支持
端点/NAT 迁移。
### 客户端:使用 KCP
引用 `GameFrameX.SuperSocket.Kcp`,用 `AsKcp(...)` 配置 `EasyClient`,随后即可在客户端上使用
常规的接收/发送 API:
```csharp
using System.Net;
using System.Text;
using GameFrameX.SuperSocket.Client;
using GameFrameX.SuperSocket.Kcp;
using GameFrameX.SuperSocket.ProtoBase;
var remoteEndPoint = new IPEndPoint(IPAddress.Loopback, 4040);
var client = new EasyClient(new LinePipelineFilter());
client.AsKcp(remoteEndPoint, new KcpConnectionOptions
{
// Conv = 0 表示由客户端生成一个非零的会话 id。
Conv = 0,
NoDelay = true,
NoDelayLevel = 1,
Interval = 10,
Resend = 2,
MaxDatagramSize = 4096
});
client.StartReceive();
await ((IEasyClient)client).SendAsync(Encoding.UTF8.GetBytes("ping\r\n"));
```
`AsKcp(...)` 会创建并绑定 UDP socket、分配或生成 `Conv`、创建 `KcpPipeConnection`、
启动 KCP 更新循环,并开始为该连接接收 UDP 包。当客户端必须绑定特定的本地 UDP 端点时,
请在 `AsKcp(...)` 之前设置 `client.LocalEndPoint`。
### KCP 配置说明
- 除非有经过实测的理由需要调优,否则请保持可空选项为未设置状态;未设置的值会沿用 KCP
的内部默认值。
- 对于实时游戏类流量,常见的起点是 `NoDelay = true`、`NoDelayLevel = 1`、
`Interval = 10`、`Resend = 2`,以及调校后的发送/接收窗口。
- 若追求保守的吞吐,请保留更多默认值,并避免关闭拥塞控制。
- `DeadLink` 是单个 KCP 分片的最大重传次数。其内部默认值并非分钟级的黑洞容忍策略;
当验收条件要求更长的黑洞容忍时间时,请有意识地调高它。
- `IdleTimeout` 属于连接生命周期层,它不是逻辑会话恢复窗口。
- `MaxDatagramSize` 应与你的网络 MTU 策略相匹配。过大的 UDP 数据报会提高分片与丢包
风险。
### ReliableSession 协议模型
需要协议帧契约与二进制编解码器时,请引用 `GameFrameX.SuperSocket.ReliableSession`:
```csharp
using System.Text;
using GameFrameX.SuperSocket.ReliableSession;
var codec = new ReliableSessionFrameCodec();
var sessionId = new SessionId(Guid.NewGuid());
var hello = new ReliableSessionHelloFrame
{
ClientInstanceId = new ClientInstanceId(Guid.NewGuid()),
ProtocolVersion = ReliableSessionProtocol.WireVersion,
RequestedOptions = new ReliableSessionHandshakeOptions
{
HeartbeatInterval = TimeSpan.FromSeconds(5),
HeartbeatTimeout = TimeSpan.FromSeconds(15),
RecoveryWindow = TimeSpan.FromMinutes(2),
ReplayWindowSize = 1024
}
};
var helloBytes = codec.Encode(hello);
var decodedHello = (ReliableSessionHelloFrame)codec.Decode(helloBytes);
var data = new ReliableSessionDataFrame
{
SessionId = sessionId,
MessageId = new MessageId(1),
Sequence = new Sequence(1),
Payload = Encoding.UTF8.GetBytes("move:1,2")
};
var dataBytes = codec.Encode(data);
var decodedData = (ReliableSessionDataFrame)codec.Decode(dataBytes);
var ack = new ReliableSessionAckFrame
{
SessionId = sessionId,
Ranges = new[] { new AckRange(new Sequence(1), new Sequence(1)) }
};
var ackBytes = codec.Encode(ack);
var decodedAck = (ReliableSessionAckFrame)codec.Decode(ackBytes);
```
ReliableSession 目前定义并校验以下帧类型:`Hello`、`HelloAck`、`Resume`、
`ResumeAck`、`Heartbeat`、`Data`、`Ack`、`SnapshotRequest`、`Snapshot`、`Close` 和 `Error`。
编解码器要求每个缓冲区恰好包含一个完整的 ReliableSession 帧;传输层的流式拆包/组帧
属于后续适配器的职责。
当前边界:
- 目前还没有任何服务端/客户端运行时开关可以启用 ReliableSession。
- 尚未包含自动心跳定时器、重连循环、恢复令牌存储、重放缓存、去重缓存或
快照提供程序。
- KCP 仍以端点加 `Conv` 作为其传输会话标识。ReliableSession 的
`SessionId` 加 `ResumeToken` 是未来的逻辑会话恢复契约,而不是当前对 KCP
端点迁移的支持。
- C3 的测试覆盖属于协议/编解码器的端到端覆盖,包括生命周期、10s/30s/60s 黑洞
恢复脚本、重放、快照回退、重复/乱序帧以及确认区间。它不是运行时传输集成覆盖。
## 架构概览
各模块从协议原语逐层向上直至宿主:
- `Primitives` / `ProtoBase` —— 原语接口与协议解码。
- `Connection` / `Channel` —— 底层通信抽象与请求管道。
- `Server` / `Server.Abstractions` / `Client` / `ClientEngine` / `Client.Proxy` —— 宿主、服务端与客户端端点。
- `Command` —— 构建在服务端之上的命令模式请求处理。
- `Udp` / `Kcp` / `ReliableSession` —— 可选传输与逻辑会话协议。
- `WebSocket` / `WebSocket.Server` / `Kestrel` / `Http` —— HTTP 系协议与宿主托管。
## 平台支持
- .NET 10.0
- Windows、macOS、Linux
## 依赖
| 模块 | 包 | 说明 |
|:---|:---|:---|
| Primitives | `GameFrameX.SuperSocket.Primitives` | 原语接口与类 |
| ProtoBase | `GameFrameX.SuperSocket.ProtoBase` | 协议解码 |
| Connection | `GameFrameX.SuperSocket.Connection` | 带管道的底层通信抽象 |
| Server Abstractions | `GameFrameX.SuperSocket.Server.Abstractions` | 服务端抽象 |
| Server | `GameFrameX.SuperSocket.Server` | 服务端宿主 |
| Client | `GameFrameX.SuperSocket.Client` | 客户端端点 |
| Client Engine | `GameFrameX.SuperSocket.ClientEngine` | 客户端引擎 |
| Client Proxy | `GameFrameX.SuperSocket.Client.Proxy` | 客户端代理支持 |
| Command | `GameFrameX.SuperSocket.Command` | 命令模式请求处理 |
| Udp | `GameFrameX.SuperSocket.Udp` | UDP 传输 |
| Kcp | `GameFrameX.SuperSocket.Kcp` | 基于 UDP 的 KCP 传输 |
| ReliableSession | `GameFrameX.SuperSocket.ReliableSession` | ReliableSession 协议模型与编解码器 |
| WebSocket | `GameFrameX.SuperSocket.WebSocket` | WebSocket 协议实现 |
| WebSocket Server | `GameFrameX.SuperSocket.WebSocket.Server` | WebSocket 服务端 |
| Kestrel | `GameFrameX.SuperSocket.Kestrel` | Kestrel 集成 |
| Http | `GameFrameX.SuperSocket.Http` | 类 HTTP 协议的共享工具 |
除 .NET 基础类库之外,各模块还依赖 `Microsoft.Extensions.*`
(Configuration、DependencyInjection、Hosting、Logging、Options)、`System.IO.Pipelines`,以及
Kestrel 模块所需的 `Microsoft.AspNetCore.App` 框架引用。
## 文档与资源
- [文档](https://gameframex.doc.alianblank.com)
- [GitHub 仓库](https://github.com/GameFrameX/GameFrameX.SuperSocket)
- [问题反馈](https://github.com/GameFrameX/GameFrameX.SuperSocket/issues)
- [上游项目](https://github.com/kerryjiang/SuperSocket)
- [上游文档](https://docs.supersocket.net/)
## 社区与支持

[](https://www.bilibili.com/video/BV1yrpeepEn7)
[](https://gitee.com/GameFrameX/gameframex)
[](https://github.com/GameFrameX/gameframex)
[](https://discord.gg/VDWUjWMDw9)
[
](https://www.linkedin.com/in/alianblank)
[](https://www.reddit.com/r/GameFrameX/)
[](https://x.com/alian_blank)
[](https://www.youtube.com/channel/UCD9QhSFJ5xZkn5NTSV-DVAw)
[](https://bsky.app/profile/alianblank.bsky.social)
## 更新日志
版本历史请参阅 [Releases](https://github.com/GameFrameX/GameFrameX.SuperSocket/releases)。
## 开源协议
详见 [LICENSE](LICENSE) 文件。