我的应用程序有一个包含 StringGrid 的服务器表单。服务器一次只允许连接 4 个客户端。当列表未满时,它将添加来自客户端的任何 tcp 连接。
当新客户端向服务器请求 TCP 连接并且列表已满时,服务器应检查此列表中的客户端以查看它们是否仍然连接。如果客户端仍然连接并且列表已满,则拒绝新客户端。如果一个或多个客户端不再连接,则接受新客户端,将其添加到列表并更新列表。
如何知道客户端是否仍然连接?
我的应用程序有一个包含 StringGrid 的服务器表单。服务器一次只允许连接 4 个客户端。当列表未满时,它将添加来自客户端的任何 tcp 连接。
当新客户端向服务器请求 TCP 连接并且列表已满时,服务器应检查此列表中的客户端以查看它们是否仍然连接。如果客户端仍然连接并且列表已满,则拒绝新客户端。如果一个或多个客户端不再连接,则接受新客户端,将其添加到列表并更新列表。
如何知道客户端是否仍然连接?
您不应该在新客户端想要连接时检查死客户端。您应该将服务器的MaxConnections
属性设置为 4,以在列表已满时阻止新连接,而不管已连接客户端的状态如何,然后在使用协议级心跳或 tcp 级保活连接时定期检查死客户端。如果心跳/keepalive 错误或超时,请断开该客户端并将其从列表中删除,从而允许新客户端连接。
两种解决方案:
它基本上取决于您的应用程序以及使客户与众不同的原因。检测唯一客户端的一种方法是客户端 IP 地址。如果多个客户端可以从同一个 IP 地址连接,则每个客户端需要有一个唯一的 ID,然后在连接到服务器时,客户端需要将其客户端 ID 传送给服务器,服务器将存储它并在新连接时验证它。