【问题标题】:How to write a tcp server use Future or .net async or others?如何使用 Future 或 .net async 或其他编写 tcp 服务器?
【发布时间】:2021-06-09 05:02:11
【问题描述】:

是的,tcp 服务器的示例太多了,但是我找不到使用 scala future 或 c#/f# async/awite 的示例

future/async 是否适合写一个简单的 tcp 服务器,比如 echo 服务器?

或者如果有像smtp这样的服务器/客户端模型,服务器和客户端会在一个会话中多次交谈(helo/ok from/ok rcpt/ok data/ok quit/ok),是future还是async适合这个模型?是否有可能服务 A 首先从客户端 A 获取 HELO,然后使用其他 smtp 命令(例如“来自”)与客户端 B 交谈?

在哪里可以找到回显服务器使用 Future 或 async/awit/Task 的示例代码?

谢谢!

【问题讨论】:

  • 除非您需要使用 SMTP 等现有协议,否则请查看NetMQ。它将使您免于在 TCP 之上构建的复杂性。它还会为您提供很多好处,例如自动重新连接和发布/订阅以及其他通信模式。

标签: c# scala asynchronous f# future


【解决方案1】:

TCP 服务器是相当复杂的野兽,而且由于数据是一个流(不是一系列有界数据包),它通常不适合只是一个“等待一些数据”API。原始套接字 API 有一个异步组件,但它不是您通常期望的形状。

Kestrel 可用于使用“管道”API 构建异步 TCP 服务器,该 API 处理诸如后台缓冲区管理之类的所有事情(当您还不能使用不完整的帧时) ) - 我有一个blog series here on that,但是:“管道”没有官方客户端 API;同样,同一个博客系列讨论了如何使用Pipelines.Sockets.Unofficial 来弥补这一差距。

但是!我想知道您是否真正想要的是一个消息传递库,它位于 TCP 层之上,所以你可以说“发送一条消息”和“等待回复消息”。存在许多这样的库,但它们总是会改变底层数据协议的形式,因为它们将引入“框架”等。这意味着如果您打算实现预先存在的协议(作为选择),它们可能不是合适的选择不会对齐)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 2018-09-12
    • 2020-09-02
    • 2015-03-31
    • 2016-01-19
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    相关资源
    最近更新 更多