Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 同一登录用户的TIdTCPServer重新连接_Delphi_Network Programming_Indy - Fatal编程技术网

Delphi 同一登录用户的TIdTCPServer重新连接

Delphi 同一登录用户的TIdTCPServer重新连接,delphi,network-programming,indy,Delphi,Network Programming,Indy,我在TIdTCPServer上构建的服务器应该只能同时为一个用户提供一个连接。我找了很多,但找不到解决办法 如果没有错误,一切看起来都是正确的,我的意思是:在开始时,客户端发送登录名和密码,方法onconnect或onexecute检查它们是否正常,并且同名的用户连接不存在。如果一切正常,则开始交换消息。否则,将调用断开连接的方法 但是,当这样一个远程应用程序(使用Indy以外的其他工具编写)无意中失去连接(由于暂时失去网络)时,服务器不会立即知道这一点,并认为一切正常。同时,客户端应用程序已经

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

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

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

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

我使用“心跳”的技巧来检查连接,但由于客户端数量巨大且传输成本高,所以每隔10秒检查一次连接-客户端使用付费gprs连接。在这段时间里,我的客户端应用程序有时会出现重新连接的问题


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

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

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

  • 立即断开以前的连接并使用新连接

  • 你决定用哪一种取决于你的特殊需要


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

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

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

  • 立即断开以前的连接并使用新连接

  • 你决定用哪一种取决于你的特殊需要


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

    感谢您给出的答案,更多的是逻辑方面,而不是技术方面。雷米,你总是马上回答。我钦佩你的辛勤工作!谢谢你的回答,更多的是逻辑方面,而不是技术方面。雷米,你总是马上回答。我钦佩你的辛勤工作!