0

我在 TIdTCPServer 上构建的服务器应该只能同时为一个用户提供一个连接。我搜索了很多,但我找不到解决办法。

如果没有错误,一切看起来都是正确的,我的意思是:在开始时客户端发送登录名和密码,方法 onconnect 或 onexecute 检查它们是否正常并且不存在具有相同名称的用户连接。如果一切正常,则开始交换消息。如果不是,则调用断开连接的方法。

但是,当这样的远程应用程序(使用 Indy 以外的其他工具编写的)无意中失去连接(由于网络暂时丢失)时,服务器不会立即知道这一点,并认为一切正常。同时客户端应用程序已经知道有一个错误。当网络连接再次良好时,客户端应用程序尝试连接到服务器,但尝试被拒绝(被服务器),因为服务器保持与该用户的最后连接(直到连接因错误事件而关闭的某个时间)。

有没有一种方法可以在快速恢复连接后绕过拒绝问题而不拒绝两个(来自同一客户端的最后和实际尝试连接以清除有关登录用户的信息),让他有可能直到下一次尝试?

我使用带有“心跳”的技巧来检查连接,但由于客户端数量众多且传输成本高,因此每隔 10 秒进行一次检查——客户端使用付费 gprs 连接。在这个时候,我的客户端应用程序有时会出现重新连接问题。

还有其他问题。当第一个连接表单用户正常并且他尝试从具有相同用户名的其他应用程序连接时,只有第二个连接必须被拒绝。

4

1 回答 1

3

如果客户端尝试使用已经“连接”的用户名/密码登录,您只有两个选择:

  1. 拒绝新连接并继续使用以前的连接,直到它断开(如果超时,断开它)。

  2. 立即断开之前的连接并使用新的连接。

您决定使用哪一种取决于您的特定需求。

您当前正在执行#1,但听起来您可能需要使用#2。但是,您的要求是“当第一个连接表单用户正常并且他尝试从具有相同用户名的其他应用程序连接时,只有第二个连接必须被拒绝。” 需要 #1 并阻止 #2。所以你有点处于catch-22的情况。服务器无法知道客户端是否异常断开客户端,它必须使用keepalives/heartbeats来检测。您不能依赖服务器套接字及时告诉您客户端已死,因为它必须首先在内部超时,并且如果没有启用保活,这可能需要很长时间。

于 2013-05-02T18:33:06.120 回答