我通过切断其互联网连接测试了多个客户端的模拟断开连接。我发现TIdTCPServer没有释放它们的线程,但没有检测到它们的断开。相比之下,当我手动关闭客户端时,服务器检测到断开连接并释放其线程。IdTCPServer不会释放突然断开连接的客户
0
A
回答
3
操作系统未及时检测到异常断开连接。丢失的套接字连接在内部超时可能需要相当长的时间,因此操作系统可能会使其无效。在操作系统这样做之前,Indy无法知道客户端连接已经消失。
为了说明这一点,你应该:
实现您的应用层数据协议超时。如果您希望客户端将某些内容发送到您的服务器,并且在一段时间内不这样做,则假定客户端已关闭并关闭连接。在闲置活动期间,要求客户端定期向服务器发送心跳命令,以保持其连接处于活动状态。您可以使用
AContext.Connection.IOHandler.CheckForDataOnSource()
方法等待数据到达,也可以使用AContext.Binding.SetSockOpt()
方法指定阻止读取的SO_RCVTIMEO
超时。如果你不能改变你的数据协议,你至少可以在套接字本身上启用TCP层保持活动。在服务器的
OnConnect
事件中,您可以调用AContext.Binding.SetKeepAliveValues()
方法启用保活。然后操作系统会为您处理保留状态,并且如果超时超时,连接将失效。
这样说,还要确保你的服务器事件处理程序没有吞咽Indy异常(从EIdException
派生)。这也可能导致服务器不能正确终止线程,如果连接丢失并且Indy引发异常,但您不允许服务器处理它。如果您需要捕获异常(用于记录等),请确保重新提出任何EIdException
衍生的异常,并让服务器处理它。
相关问题
- 1. 客户端断开连接
- 2. 客户端断开连接时,服务器不会移除/断开套接字
- 3. 突然WCF的资源清理会话服务断开连接
- 4. 断开单个客户端的连接会断开许多其他客户端的连接
- 5. socket.io断开连接事件,客户端断开连接检测
- 6. 如果通过代理连接,客户端不会断开连接
- 7. 客户端断开连接后,进程是否仍然继续
- 8. Websocket客户端断开连接websocket4net
- 9. 处理TCP客户端断开连接
- 10. “客户端断开连接”HttpException
- 11. PHPWebsocket客户端立即断开连接
- 12. 客户端连接/断开qjsonrpc事件
- 13. socket.id断开连接客户端?
- 14. SignalR .NET客户端断开连接
- 15. 重新连接断开连接的客户端套接字
- 16. Android tcp客户端连接,然后从java服务器断开连接
- 17. 突然断开连接后,Socket.io客户端无法重新连接到服务器
- 18. 社会会议不释放连接
- 19. 将客户端断开连接并重新连接到接收者会话
- 20. 当客户端断开连接时,PHP脚本会中止吗?
- 21. 如何从客户端断开连接并重新连接socket.io?
- 22. 扭曲 - 我需要定期连接/断开客户端连接
- 23. socket.io客户端连接重复断开连接
- 24. 插槽选择()办理突然断开连接
- 25. 以下代码中数据库突然断开连接
- 26. 扭曲不检测客户端断开连接
- 27. Red5连接不关闭客户端断开
- 28. 客户端在断开连接之前不会发送所有数据
- 29. 在IIS上停止站点后,SignalR客户端不会断开连接