【发布时间】:2014-09-01 22:22:52
【问题描述】:
在一个类似农场的在线游戏中,我需要验证服务器客户端的漫长过程,比如建造房屋。假设建造房子需要 10 分钟。客户端在开始建造房屋时通过 TCP 连接异步发送“开始建造”消息,并在认为房屋建造时发送“完成建造”消息。在服务器上,我需要验证房子是在至少 10 分钟内建成的。问题是服务器不知道客户端何时发送“开始构建”和“完成构建”消息。它知道何时收到消息,但存在网络延迟,可能的网络故障和消息可能足够长以占用几个 tcp 段。据我了解,客户端发送消息所花费的时间可能长达几分钟,并且取决于客户端 TCP 配置。问题是:有没有办法知道消息何时在客户端发出?如果不是,我如何保证该消息的发送时间段,可能是一些服务器 TCP 配置?该服务器中的一些超时要么接收消息,要么失败。任何其他我可能没有想到的主要任务的解决方案也是受欢迎的。
提前致谢!
【问题讨论】:
-
为什么还要关心这个?你知道什么时候开始建房子,让服务器在 10 分钟后向客户端发送消息。
-
房屋建造可以中断和/或其他工作速度不同的工人可以稍后开始建造。对于用户来说,它应该看起来尽可能流畅,服务器的构建时间没有变化,所以服务器只做乐观的验证,让客户端欺骗而不是惩罚诚实的客户端。我不希望服务器运行单独的任务来确定何时向可能不再连接的客户端发送“完成构建”的另一个原因。如果没有其他选择,我可能会不得不做类似的事情,但我想先寻找一种方法来限制客户端滞后模糊性。
-
如果您只是想减少延迟并且不打扰客户作弊。我会推荐使用 UDP,因为在大多数情况下它是真正异步的并且比 TCP 更快。由于您不想传输文件而是传输非常短的消息,因此它可能最适合您的游戏(就像大多数其他多人游戏一样)。
-
UDP 也有同样的问题,甚至更糟 - 有了它,我什至不知道是否发送了消息,不仅仅是发送时间。
标签: sockets tcp client-server validation