【问题标题】:Are there some general Network programming best practices?是否有一些通用的网络编程最佳实践?
【发布时间】:2011-01-28 11:22:28
【问题描述】:

我正在我们的项目中实现一些网络功能。已经确定通信非常重要,我们希望同步进行。所以客户端发送一些服务器确认的东西。

对于客户端和服务器之间的交互,是否有一些通用的最佳实践。例如,如果服务器没有回答,客户端是否应该自动重试?在重试之前是否应该有一个超时时间?如果确认失败会发生什么?我们在什么时候断开连接并重新连接?有材料吗?我已经进行了搜索,但没有真正出现。

我正在寻找一般的最佳做法。我正在 c# 中实现这个(可能使用套接字),所以如果有任何特定于 .Net 的内容,请也告诉我。

【问题讨论】:

标签: network-programming


【解决方案1】:

网络的第一条规则 - 你是在发送消息,你不是在调用函数。

如果您以这种方式处理网络,并且不要假装您可以远程调用函数或拥有“远程对象”,那么您会没事的。在网络连接的另一端你永远不会有一个实际的“东西”——你所拥有的基本上是那个东西的图片。

您从网络获得的一切都是旧数据。你永远是最新的。因此,您需要确保您的消息具有正确的语义 - 例如,您可以按一个值递增或递减某个值,您不应将其值设置为当前值加上或减去另一个值(因为当前值可能在您的消息到达那里时更改)。

【讨论】:

    【解决方案2】:

    如果客户端和服务器都是用 .NET/C# 编写的,我建议使用 WCF 插入原始套接字,因为它可以为您节省大量包含序列化和反序列化、消息同步等的管道代码。

    这可能并不能真正回答您关于最佳实践的问题 ;-)

    【讨论】:

      【解决方案3】:

      首先要做的是从速度、丢失消息的概率、名义和峰值流量、瓶颈、客户端和服务器 MTBF 等方面来描述您的特定网络......

      只有这样,您才能决定您的协议需要什么。在许多情况下,您不需要复杂的错误处理机制,并且可以使用普通 UDP 可靠地实现服务。

      在少数情况下,您需要构建更强大的东西,以便在通过您无法信任的网络连接的多台机器之间保持一致的全局状态。

      【讨论】:

        【解决方案4】:

        我发现最重要的一点是消息始终应该是无状态的(如果这对您毫无意义,请阅读 REST)

        例如,如果您的应用程序通过网络监控发货数量,则不要发送增量更新 (+x),而是始终发送新的总数。

        【讨论】:

        • 这很有意义。好建议。对我们来说幸运的是,我们的消息是无状态的。这更多是巧合而不是设计:)
        • 对你有好处!我最近不得不回顾性地更改一个应用程序,该应用程序具有用于各种事物的切换消息,最终总是会感到困惑。
        • 无状态是一个很好的一般准则,但不是总是必需的。有些场景确实需要非无状态消息——这取决于具体情况。但是,首先实现无状态是一个很好的启发式方法。像“切换消息”这样的东西本质上是不好的。另一方面,正如我在回答中指出的那样,“增量”之类的东西通常正是您想要的,因为它总是会在服务器上做正确的事情(如果您认为当前值,则“设置为 5”是 4)
        【解决方案5】:

        在一个常见的网络编程思维中,我认为你应该了解:
        1. 插座(当然)。
        2. 分叉和穿线。
        3. 锁定进程(使用互斥量或信号量或其他)。

        希望对您有所帮助..

        【讨论】:

        • 嗨,谢谢,但不是真的。所有这些都很好。我只是在寻找一些一般指导方针。例如使用 ACK 等。
        • 我不会学习线程,而是学习非阻塞 IO(如果在套接字级别工作,那就是)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-18
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 2014-02-10
        相关资源
        最近更新 更多