【问题标题】:How to do simple, reliable network messaging?如何做简单、可靠的网络消息传递?
【发布时间】:2012-01-21 12:08:52
【问题描述】:

我现在正在使用套接字在各种进程之间进行通信。一切都在同一台机器上运行,所以没有丢包,我也没有读取超时等。消息通常是小数据块(JSON,有时是二进制)。现在我想做跨机器通信.客户端/服务器连接通常如下所示:客户端告诉服务器开始一些处理(传递任务描述),服务器完成工作并反馈进度,客户端可以选择在其间发送终止消息。完成后,服务器会在客户端完全断开连接时继续侦听(即会话结束,启动新任务会启动新会话。)

我应该如何进行沟通?我可以轻松地继续在网络上使用套接字,但我的理解是我现在需要添加大量错误处理来识别消息何时没有通过并将其以某种方式传回服务器。我想要的只是send(message, target),请放心,完整的消息会被传输;加上对方死亡时的一些通知。我已经看到有一些像 zero-mq 这样的库声称可以做到这一点,但还有更多,我不确定这样的消息传递库是否真的必要。是否有一些易于使用的库来进行一些基本的交流?

我正在使用 C++ 和 Python,而 BSD 风格的许可证绝对是库的首选。该库也应该相当稳定,因为通信部分并不是很重要,我希望能够坚持使用一种解决方案。

【问题讨论】:

    标签: python c networking network-programming


    【解决方案1】:

    TCP 保证所有的包都被传递到目的地[如果没有,它会为你重新发送]。所以,如果你使用它 - 它可能会花费更多时间 [与单机相比],但 msg 传输的正确性仍然存在。

    【讨论】:

    • 所以只要我坚持使用 TCP,我就准备好了?
    • 有一个奇怪的边缘情况,即网络过于堵塞,并且无论如何 msg 都不会到达 - 但是,如果是这种情况 - 你无能为力让它通过。除此之外 - 是的,你几乎已经设置好了 TCP。
    • 您可能需要添加一些错误处理来应对节点故障(例如,客户端或服务器出现故障,因此连接被中止)。但除此之外,你应该对 TCP 没问题。
    • 我应该从recv 获得这些信息,对吧? IE。如果连接失效,那么recv 会立即可靠地失败吗?
    • 并不总是能够区分死连接和一个非常非常慢的连接。所以,不,它不会总是立即失败(你需要一个超时)。
    【解决方案2】:

    您应该查看ZeroMQ。它具有比纯 BSD 套接字更简单的界面、更便携且具有优秀文档。

    【讨论】:

      【解决方案3】:

      查看networkComms.net 以获取开源网络通信库。

      【讨论】:

        【解决方案4】:

        听起来您需要一个消息队列。

        有很多很多的解决方案,其中只有一个是redis:http://redis.io

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-23
          • 2017-01-27
          • 1970-01-01
          • 2016-06-14
          相关资源
          最近更新 更多