我正在使用 indy 10(阻塞模式)编写一个简单的客户端/服务器聊天程序,并且有一个问题是如何管理连接?例如假设一个用户在服务器上在线,我们必须为将来的请求建立一个连接隧道。换句话说,当用户在线时,服务器不应该需要用户名和密码来处理未来的用户请求。这将与我们在用户到来时创建的隧道有关。
我们如何管理连接?
[对不起我的英语不好]如果你听不懂我请告诉我发一个新的帖子。
谢谢
我正在使用 indy 10(阻塞模式)编写一个简单的客户端/服务器聊天程序,并且有一个问题是如何管理连接?例如假设一个用户在服务器上在线,我们必须为将来的请求建立一个连接隧道。换句话说,当用户在线时,服务器不应该需要用户名和密码来处理未来的用户请求。这将与我们在用户到来时创建的隧道有关。
我们如何管理连接?
[对不起我的英语不好]如果你听不懂我请告诉我发一个新的帖子。
谢谢
对于问题中描述的场景,实际上并没有太多的管理工作要做。为避免必须对每个请求重新进行身份验证,请不要关闭连接。特别是在聊天服务器中,每个参与者很可能会建立一个连接,然后在聊天期间继续使用相同的连接。
Indy 服务器对象已经保存了他们打开的连接列表,所以当你想向其他参与者广播聊天消息时,你可以遍历该列表。
我认为每秒 100000 次检查将比拥有 10000 个持久 TCP 连接消耗更少的资源。无论如何,您将需要以某种方式处理这 100000 个命令,因此这些检查不会成为瓶颈。
尝试改用 UDP 消息。例如,大多数 MMO 游戏同时使用 TCP 和 UDP 连接。TCP 仅用于关键数据,UDP 用于任何其他数据。在您的情况下,UDP 似乎是可以接受的。客户端可以发送带有一些自动增量 ID 的 UDP 数据包,服务器可以定期发回它没有收到的 ID 列表,因此客户端可以重新发送它们。
如果客户端登录,一种选择是在服务器端创建一个唯一的会话 ID(或“令牌”),例如 GUID。并且在每个请求中,客户端都包含此令牌。
服务器将维护一个客户端会话和相关会话数据的列表,并在该列表中查找令牌。
即使客户端暂时与 Internet 断开连接但仍知道其令牌,应用程序也可以重新连接并继续与服务器的会话。