有一些通用的网络编程最佳实践吗?

6
我正在实现一些网络相关的工作。已经决定通信非常重要,我们希望进行同步处理。因此,客户端发送信息,服务器进行确认。

在客户端和服务器之间的交互中,是否有一些通用的最佳实践?例如,如果服务器没有回复,客户端应该自动重试吗?在重新尝试之前,是否应该设置超时时间?如果确认失败会发生什么?我们何时断开连接并重新连接?是否有相关资料可以查阅?我已经进行了搜索,但是没有找到真正有用的内容。

我正在寻找通用的最佳实践。我将在c#中实现此功能(可能使用sockets),因此如果有任何与.Net相关的内容,请告诉我。


1
可能会对您感兴趣:https://dev59.com/e3E95IYBdhLWcg3wSsGD。 - Justin Ethier
5个回答

7

网络编程的第一条规则是:你发送的是消息,而不是调用函数。

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

所有从网络获取的数据都是旧数据。你永远不会是最新的。因此,你需要确保你的消息携带正确的语义 - 例如,你可能会通过一个值来增加或减少某个值,但你不应该将其值设置为当前值加上或减去另一个值(因为当前值可能会在你的消息到达时发生改变)。


2
如果客户端和服务器都是用.NET/C#编写的,我建议使用WCF而不是原始套接字,因为它可以省去很多与序列化、反序列化、消息同步等相关的代码。这可能并没有真正回答你关于最佳实践的问题。

1

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

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

在少数情况下,您需要构建更加强大的东西,以便在通过您不能信任的网络连接的几台计算机之间维护一致的全局状态。


1
我发现最重要的是消息应该始终保持无状态(如果您对此一无所知,请阅读有关REST的内容)。
例如,如果您的应用程序监视网络上的运输数量,请不要发送增量更新(+x),而是始终发送新的总数。

这非常有道理。好建议。幸运的是,我们的消息是无状态的。不过这更多是巧合而非设计 :) - uriDium
很好!最近我不得不回顾更改一个应用程序,该应用程序为各种事情提供了切换消息,最终总是会混淆。 - Christopher Oezbek
无状态是一个很好的通用准则,但并不总是必需的。有些情况确实需要非无状态消息-这取决于具体情况。然而,首先采用无状态是一个很好的启发式方法。而像“切换消息”这样的东西本质上是不好的。另一方面,正如我在我的答案中指出的那样,“增量”这样的东西通常正是你想要的,因为它总是会在服务器上执行正确的操作(与“将其设置为5”相比,如果你认为当前值为4)。 - kyoryu

0
在网络编程中,我认为你应该学习以下内容:
1. Socket(当然)。
2. Fork 和 Threading。
3. 进程锁定(使用互斥量、信号量或其他方式)。
希望这能帮到你。

嗨,谢谢但不是很需要。所有那些东西都没问题。我只是在寻找一些通用的指导方针。例如ACK的用法等。 - uriDium
不要学习线程,而是学习非阻塞IO(如果在套接字级别工作的话)。 - kyoryu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接