(如何)我可以使用 ASP.NET Core 进行自定义 TCP 数据包通信吗?
(How) Can I use ASP.NET Core for custom TCP packet communication?
我有一个带有典型 TCP 数据包协议(长度/类型/数据[长度])的过时游戏服务器,我的任务是找到现代框架来重写它。
在 ASP.NET Core 2.1 中编写了一个(小的)RESTish API,我知道它提供了 DI / 日志记录 / 配置功能,可以完美地替代旧服务器中的类似功能。我想我可以使用 ASP.NET 核心,让它处理所述 TCP 数据包而不是 HTTP 请求。
现在我有点不知道从哪里开始,以及它是否/如何适合 ASP.NET 核心。
到目前为止,我已经了解了 RTFM 的内部 ASP.NET 核心工作原理,并发现了一些让我感到困惑的事情:
- Official docs state Kestrel only supports HTTP based scenarios (don't wanna use IIS). So does the tag SO.
- 然后我发现一个 project 声称要为 Kestrel 添加 TCP 支持,但我不完全理解它是如何完成的。它似乎是通过实现
ConnectionHandler
来完成的,但我看不到,例如,它从哪里开始 TcpListener
来接受与客户端的新的连续连接。
- 由于 Kestrel 似乎不可能,我考虑编写一个
IHostedService
或 BackgroundService
来进行所有 TCP 通信。
- 然后我不知道我是否可以使用中间件通过管道传输我的 TCP 数据包(想到授权和游戏逻辑中间件)。 Official docs 快速谈论 HTTP 或 "web" 请求,所以我认为典型的中间件管道也是不可能的。
总而言之,我的研究得出以下两个问题:
- 我真的可以使用 Kestrel 进行二进制通信的连续 TCP 连接吗?
- 中间件管道和 HTTP 功能/Kestrel 之间有什么关系?我可以在自定义服务中使用中间件管道进行 TCP 通信吗?
回到这里后,我意识到 Project Bedrock is aiming to further generalize Kestrel to support completely custom protocols, not even limited to raw TCP. An overview / description can be found here。
上面的 link 显示了 GitHub 存储库中项目的当前 public 状态,并提供了很好的实际示例。它 seems to be planned to be integrated with whatever follows the ASP.NET Core roadmap for .NET 6,但与 .NET Core 3.1 兼容的预发布版本可用并且在我的实验中效果很好。
我有一个带有典型 TCP 数据包协议(长度/类型/数据[长度])的过时游戏服务器,我的任务是找到现代框架来重写它。
在 ASP.NET Core 2.1 中编写了一个(小的)RESTish API,我知道它提供了 DI / 日志记录 / 配置功能,可以完美地替代旧服务器中的类似功能。我想我可以使用 ASP.NET 核心,让它处理所述 TCP 数据包而不是 HTTP 请求。
现在我有点不知道从哪里开始,以及它是否/如何适合 ASP.NET 核心。 到目前为止,我已经了解了 RTFM 的内部 ASP.NET 核心工作原理,并发现了一些让我感到困惑的事情:
- Official docs state Kestrel only supports HTTP based scenarios (don't wanna use IIS). So does the tag SO.
- 然后我发现一个 project 声称要为 Kestrel 添加 TCP 支持,但我不完全理解它是如何完成的。它似乎是通过实现
ConnectionHandler
来完成的,但我看不到,例如,它从哪里开始TcpListener
来接受与客户端的新的连续连接。 - 由于 Kestrel 似乎不可能,我考虑编写一个
IHostedService
或BackgroundService
来进行所有 TCP 通信。 - 然后我不知道我是否可以使用中间件通过管道传输我的 TCP 数据包(想到授权和游戏逻辑中间件)。 Official docs 快速谈论 HTTP 或 "web" 请求,所以我认为典型的中间件管道也是不可能的。
总而言之,我的研究得出以下两个问题:
- 我真的可以使用 Kestrel 进行二进制通信的连续 TCP 连接吗?
- 中间件管道和 HTTP 功能/Kestrel 之间有什么关系?我可以在自定义服务中使用中间件管道进行 TCP 通信吗?
回到这里后,我意识到 Project Bedrock is aiming to further generalize Kestrel to support completely custom protocols, not even limited to raw TCP. An overview / description can be found here。
上面的 link 显示了 GitHub 存储库中项目的当前 public 状态,并提供了很好的实际示例。它 seems to be planned to be integrated with whatever follows the ASP.NET Core roadmap for .NET 6,但与 .NET Core 3.1 兼容的预发布版本可用并且在我的实验中效果很好。