我最近遇到的最大问题是:当客户端非正常断开连接(例如客户端崩溃或关闭,而不告诉服务器它将要断开连接)时,我必须检测到并且Indy无法做到这一点。如果我想要这样做,我必须开发像心跳、轮询或TCP保持活动之类的算法。我不想再花费更多时间去完成至少我认为是组件工作的任务。经过一些研究,我发现这不是Indy的错,而是所有阻塞套接字组件的问题。
现在我真的在考虑将服务器的核心更改为另一个好的套件。我必须承认,我倾向于使用非阻塞套接字。基于此,我有一些问题:
- 从阻塞套接字切换到非阻塞套接字的好处是什么?
- 我能够检测到客户端的非正常断开吗?
- 哪个组件套件的产品最好?我所说的最佳产品是:快速、良好的支持、良好的工具和易于实现。
我知道这可能是一个主观的问题,但我真的想听听你的意见。我最关心的是我的第一个问题。我不介意支付100、500、1000、10000美元,但我想要一个完整的解决方案。目前,我正在考虑Ip*works。
编辑
我认为有些人没有理解我的意思。我不想创建自己的套接字。我一直在使用套接字工作很长时间了,已经感到厌倦了。真的。
非阻塞套接字可以检测到客户端的非正常断开。这是一个事实,并且它在互联网上有良好的文档。非阻塞套接字会一直检查新传入数据的套接字状态,并且可以检测到套接字无效。这不是心跳算法。心跳算法用于客户端,并定期发送数据包(也称为保持活动)到服务器以告诉它仍然存活。
编辑
我可能没有表达清楚,可能是因为英语不是我的母语。 我的意思不是说可以在不尝试从套接字发送或接收数据的情况下检测到断开的连接。我想说的是,每个非阻塞套接字都能够做到这一点,因为它们不断尝试从套接字读取新的传入数据。 为什么这么难理解呢?如果你们下载并运行ip * works演示程序,特别是echoserver和echoclient(都使用TCP),你们就可以自己测试。我已经测试过了,它像我期望的那样工作。即使你在非阻塞模式下使用旧的TCPSocketServer和TCPSocketClient,你也会看到我的意思。