【发布时间】:2011-08-19 20:31:40
【问题描述】:
我们有一个使用 Delphi 2010 和 Indy 10 开发的应用服务器。该服务器每秒接收超过 50 个请求,并且运行良好。但在某些情况下,在我看来,Indy 非常晦涩难懂。他们的组件很好,但有时我发现自己深入研究源代码只是为了理解一件简单的事情。 Indy 缺乏良好的文档和良好的支持。
我遇到的最后一件事对我来说是一个大问题:我必须检测客户端何时非正常断开连接(例如,当客户端崩溃或关闭时。没有告诉服务器它将断开连接)并且 indy 无法去做。如果我愿意,我将不得不开发一种算法,如心跳、池或 TCP 保持活动。我不想花更多的时间做一个,至少我认为,组件工作。经过一番研究,我发现这不是 Indy 的错,而是所有阻塞套接字组件的问题。
现在我真的在考虑将服务器的核心更改为另一个好的套件。我必须承认我倾向于使用非阻塞套接字。基于此,我有一些问题:
- 从阻塞套接字更改为非阻塞套接字有什么好处?
- 我能否检测到客户端断开连接(非正常)?
- 哪个组件套件的产品最好?我所说的最佳产品是指:快速、良好的支持、良好的工具和易于实施。
我知道这一定是一个主观问题,但我真的很想听听您的意见。我的第一个问题是我最关心的问题。我不在乎我是否必须支付 100、500、1000、10000 美元,但我想要一个完整的解决方案。目前,我正在考虑Ip*works。
编辑
我认为有些人不明白我想要什么。我不想创建自己的套接字。我使用套接字已经很长时间了,我已经厌倦了。真的。
非阻塞套接字可以检测客户端断开连接。这是事实,它在整个互联网上都有很好的文档。非阻塞套接字始终检查套接字状态是否有新的传入数据,并且可以检测到套接字无效。这不是心跳算法。客户端使用心跳算法,它会定期向服务器发送数据包(也称为保持活动),以告知服务器仍然处于活动状态。
编辑
我没有说清楚。也许是因为英语不是我的主要语言。 我并不是说无需尝试从套接字发送或接收数据就可以检测到断开的连接。我的意思是,每个非阻塞套接字都能够做到这一点,因为它们不断尝试从套接字读取新的传入数据。 为什么这么难理解?如果你们下载并运行 ip*works 演示,特别是 echoserver 和 echoclient(都使用 TCP),您可以自己测试。我已经对其进行了测试,它的工作方式与我预期的一样。即使您在非阻塞模式下使用旧的 TCPSocketServer 和 TCPSocketClient,您也会明白我的意思。
【问题讨论】:
-
不优雅地断开连接到底是什么意思?
-
非阻塞套接字不能比阻塞套接字检测到丢失的连接 - 请参阅下面的答案。
-
如果由于客户端正常关闭而导致底层连接确实断开,PS Indy 可以很好地断开服务器连接。我有一些非常强大的 TCP 服务器,它们已经运行了多年,没有出现“掉线”连接的问题。最后,我认为在服务器上使用阻塞套接字有更多的优势——它使架构更清晰、更具可扩展性,所以我给你的建议是不要改变。
-
您可以在 Indy 中为客户端和服务器执行相同的操作。只需使用 IoHandler.CheckForDataOnSource 然后从套接字读取 IoHandler.InputBuffer.Size 字节。对于每个连接,我都在 10 毫秒的循环中运行。那么你不能用 Indy 做什么呢?
-
@Rafael,无论其他点如何,您都无法通过从套接字读取来检测死客户端 - 为此,您必须写入它。读取是一种被动操作,无法检测到断开的连接。
标签: delphi sockets components