Hol*_*rwa 12 delphi tcp indy delphi-2009 indy10
我的Server-App使用TIdTCPServer,多个客户端应用程序使用TIdTCPClients连接到服务器(所有计算机都在同一个LAN中).
有些客户只需要每隔几分钟就联系一次服务器,其他人每秒钟就会联系一次,一次只需要每秒20次.
如果我保持客户端和服务器之间的连接打开,我将保存重新连接,但必须检查连接是否丢失.
如果我在每次传输后关闭连接,则每次都必须重新连接,但不需要检查连接是否仍然存在.
做这个的最好方式是什么?
我应该以哪种频率进行数据传输?
两种情况的其他优点/缺点是什么?
Rem*_*eau 14
我建议将两者结合起来.打开新连接时,为其启动空闲计时器.无论何时交换数据,都要重置计时器.如果计时器过去,请关闭连接(或向客户端发送命令,询问它是否希望连接保持打开状态).如果在需要发送数据时已关闭连接,请打开新连接并重复.这样,可以定期关闭不经常使用的连接,而更常用的连接可以保持打开状态.
来自实验的两分钱......
我的第一个TCP/IP客户端/服务器应用程序为每个请求使用了一个新连接和一个新线程......几年前......
然后我发现(使用ProcessExplorer)它消耗了一些网络资源,因为所有已关闭的连接确实没有被破坏,但是在一段时间内保持特定状态.创建了很多线程......
我甚至在很多concurent请求中遇到了一些连接问题:我的服务器上没有足够的端口!
所以我重写了它,遵循HTTP/1.1方案和KeepAlive功能.它更高效,使用少量线程,ProcessExplorer喜欢我的新服务器.我再也没有用完港口了.:)
如果客户端必须关闭,我将使用ThreadPool,至少不要为每个客户端创建一个线程...
简而言之:如果可以,请将客户端连接保持活动状态几分钟.
小智 6
虽然每隔几分钟对一个活动的应用程序进行连接和断开连接可能没什么问题,但是每秒通信几次的应用程序会通过保持连接打开来提高性能.
此外,如果您不打算不断打开,关闭或诊断打开的连接,您的代码将非常简单.通过正确的打开和关闭逻辑,以及围绕读写的SEH,没有理由在使用之前测试套接字是否仍然连接,只需使用它.它会在出现问题时告诉你.
我倾向于在大多数企业应用程序中保持单个连接处于打开状态.它通常会导致更清晰的代码,更容易维护.
/ twocents