【问题标题】:Libuv - multiple TCP requests on a single connectionLibuv - 单个连接上的多个 TCP 请求
【发布时间】:2015-08-31 15:03:05
【问题描述】:

使用 Libuv,我实现了一个调用另一个 TCP Server B 的 TCP Server A。

由于服务器 A 不断收到请求,我使用从 A 到 B 建立的单个 TCP 连接向服务器 B 发送请求。

鉴于 Libuv 是异步和面向回调的,我如何区分服务器 B 的响应?即如何将正确的结果发送回服务器 A 的客户端?

文档说uv_read_cb 回调将被调用多次。我如何知道调用 uv_read_cb 的原始请求是什么?

【问题讨论】:

  • TCP 之上的协议是什么?没有协议中立的方法可以做到这一点。例如,多路复用 HTTP 请求的方式与多路复用 SMTP 请求的方式完全不同。

标签: sockets tcp asyncsocket libuv


【解决方案1】:

TCP 是基于流的,而不是基于消息的 - 您不是在发送单个消息,而是在发送未区分的数据流。所以简而言之,你想做的事情总是很棘手,处理完全取决于你。

您需要在 TCP 之上创建自己的协议。根据您的要求,这可以像分配唯一 ID 并将其与响应一起发送一样简单。当然,您还必须自己处理消息转换——就像任何基于 TCP 的消息协议一样。我强烈建议只使用单个线程将任何数据写入 TCP 流 - 您可以使用线程安全队列来发布消息,这样它们就不会被通常的异步写入破坏。

毫无疑问,读取回调将拾取碎片和合并的消息。这是一个标准的 TCP 场景,您需要为此做好准备。这就是为什么我还推荐一个阅读器,它将从流中读取,并将每条解析的消息发布到另一个队列。您可以根据需要使用随请求发送的唯一 ID 进行配对。

【讨论】:

    猜你喜欢
    • 2011-08-05
    • 2016-11-19
    • 2020-08-12
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多