最佳实践:每次传输后保持TCP / IP连接打开或关闭?

时间:2011-02-17 16:33:33

标签: delphi tcp delphi-2009 indy indy10

我的服务器应用程序使用TIdTCPServer,多个客户端应用程序使用TIdTCPClients连接到服务器(所有计算机都在同一个LAN中)。

有些客户只需要每隔几分钟就联系一次服务器,其他人每秒钟就会联系一次,其中一个客户每秒约20次。

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

如果我在每次传输后关闭连接,则每次都必须重新连接,但不需要检查连接是否仍在那里。

这样做的最佳方式是什么?

我应该以何种频率进行数据传输?

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

7 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:8)

实验中的两分钱......

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

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

我甚至在很多concurent请求中遇到了一些连接问题:我的服务器上没有足够的端口!

所以I rewrote it遵循HTTP / 1.1方案和KeepAlive功能。它更高效,使用少量线程,ProcessExplorer喜欢我的新服务器。我再也没有用完港口了。 :)

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

简而言之:如果可以,请将客户端连接保持活动状态几分钟。

答案 2 :(得分:6)

虽然每隔几分钟对一个活动的应用程序进行连接和断开连接可能没什么问题,但是每秒通信几次的应用程序会通过保持连接打开来提高性能。

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

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

/ twocents

答案 3 :(得分:3)

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

您还需要考虑未来,将来是否有可能需要保持联系?如果是的话,那么你已经回答了自己的问题。

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

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

答案 4 :(得分:3)

除非你扩展到数百个并发连接,否则我肯定会保持开放 - 这是两个选项中最好的。一旦您将数百个扩展到数千个并发连接,您可能需要删除并重新连接。我已经构建了我的整个框架(http://www.csinnovations.com/framework_overview.htm),因为它允许我在需要时从服务器“推送”数据到客户端。您需要编写相当多的代码来确保连接正常运行(网络丢失,定时ping等),但如果您在“框架”中执行此操作,那么您的应用程序代码可以用这样的方式编写你可以假设连接总是“向上”的方式。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

当关闭连接作为客户端时,您使用的端口暂时不可用。因此,在高容量时,您正在使用大量不同的端口。对于任何重复的事情我会保持开放。