18

我的 Server-App 使用 TIdTCPServer,几个 Client 应用程序使用 TIdTCPClients 连接到服务器(所有计算机都在同一个 LAN 中)。

一些客户端只需要每隔几分钟就与服务器联系一次,而另一些则每秒一次,而一个客户端每秒会这样做大约 20 次。

如果我保持客户端和服务器之间的连接打开,我将保存重新连接,但必须检查连接是否丢失。

如果我在每次传输后关闭连接,每次都必须重新连接,但无需检查连接是否仍然存在。

做这个的最好方式是什么?

一般来说,我应该以什么频率的数据传输保持连接打开?

这两种情况的其他优点/缺点是什么?

4

7 回答 7

18

我建议将两者混合使用。打开新连接时,为其启动空闲计时器。每当交换数据时,重置计时器。如果计时器到时,关闭连接(或向客户端发送命令,询问它是否希望连接保持打开状态)。如果在需要发送数据时连接已关闭,请打开一个新连接并重复。这样,不常用的连接可以定期关闭,而常用的连接可以保持打开状态。

于 2011-02-17T22:17:12.943 回答
9

实验两分钱...

我的第一个 TCP/IP 客户端/服务器应用程序为每个请求使用一个新连接和一个新线程......几年前......

然后我发现(使用 ProcessExplorer)它消耗了一些网络资源,因为所有关闭的连接确实没有被破坏,而是在一段时间内保持特定状态。创建了很多线程...

我什至遇到了很多并发请求的连接问题:我的服务器上没有足够的端口!

所以我重写了它,遵循 HTTP/1.1 方案和KeepAlive特性。它效率更高,使用少量线程,ProcessExplorer 喜欢我的新服务器。而且我再也没有用完港口。:)

如果客户端必须关闭,我将使用 ThreadPool 至少不要为每个客户端创建线程......

简而言之:如果可以的话,让你的客户端连接保持活跃几分钟。

于 2011-02-17T17:25:58.533 回答
7

虽然对于每隔几分钟处于活动状态的应用程序连接和断开连接可能很好,但每秒通信几次的应用程序将通过保持连接打开来提高性能。

此外,如果您不尝试不断打开、关闭或诊断打开的连接,您的代码将非常简单。使用正确的打开和关闭逻辑以及读写周围的 SEH,没有理由在使用前测试套接字是否仍然连接,只需使用它即可。它会在出现问题时告诉您。

我倾向于在大多数企业应用程序中保持单个连接打开。它通常会导致代码更简洁,更易于维护。

/两分钱

于 2011-02-17T16:55:03.207 回答
3

我想这完全取决于您的目标以及在给定时间内在服务器上发出的请求数量,更不用说服务器上的可用带宽和硬件了。

您还需要考虑未来,是否有可能在未来您需要保持开放的连接?如果是这样,那么您已经回答了自己的问题。

我为一个项目实现了一个聊天系统,其中约 50 人(每 2 个月增长一次)始终保持连接,除了聊天之外,它还包括数据传输、使用某些命令进行数据库操作等。我的实现是保持从应用程序启动到应用程序关闭,与服务器的连接一直打开,到目前为止没有任何问题,但是如果由于某种原因失去连接,它会自动重新建立,一切都会完美无缺。

总的来说,我建议您尝试两者(保持连接打开并在使用后关闭它),看看哪个最适合您的需求。

于 2011-02-17T18:41:37.977 回答
3

除非您要扩展到数百个并发连接,否则我肯定会保持打开状态 - 这是两种选择中更好的选择。一旦您将数百个并发连接扩展到数千个,您可能不得不放弃并重新连接。我已经围绕这个( http://www.csinnovations.com/framework_overview.htm )构建了我的整个框架,因为它允许我在需要时从服务器“推送”数据到客户端。您需要编写大量代码以确保连接正常运行(网络中断、定时 ping 等),但如果您在“框架”中执行此操作,那么您的应用程序代码可以这样编写这样您就可以假设连接始终“启动”。

于 2011-02-18T00:06:53.280 回答
0

问题是每个应用程序的线程数限制,大约 1400 个线程。因此最多同时连接 1300 个客户端 +-。

于 2017-05-28T02:28:08.893 回答
0

当作为客户端关闭连接时,您使用的端口将有一段时间不可用。因此,在大容量下,您正在使用大量不同的端口。对于任何重复的东西,我都会保持打开状态。

于 2018-02-02T05:41:08.117 回答