用于低延迟网页游戏的 HTTP 或 Websocket?

HTTP or Websocket for a low-latency web game?

我是网络开发新手,只想了解一些性能比较。

我正在 web 上构建俄罗斯方块战斗游戏。大多数游戏逻辑都在用 C++ 构建的服务器内部。对于客户,我打算使用cocos2d-js,基本上就是javascript。

玩家的行为会影响对手。首先,用户的输入需要正确地到达服务器,服务器将输入应用到逻辑中,并将新的游戏状态发送回客户端。客户端只需要在屏幕上表示精灵。

我最初的计划是使用 TCP 套接字来实现它,因为它可能需要低延迟。但是,我刚刚意识到我们不在网络上使用 TCP 套接字。

这种应用使用HTTP连接可行吗? 我应该尝试网络套接字吗? 有什么优缺点?

您当然可以为此使用 HTTP,但对于实时通信,最好的选择是使用 websockets。

原始套接字(也称为 TCP 套接字)不属于 W3C 标准。 即使某些浏览器具有 implemented 它们,我还是建议您避免使用它们,除非您不关心使用该特定浏览器锁定您的应用程序。

通常,使用 Websockets 将是您的最佳选择,它们提供与原始套接字相同的性能,并且更易于从 JS 使用。 不幸的是,使用 C++ 服务器可能会更复杂,因为您的服务器必须实现该协议,您可以在 Internet 上找到一些实现,例如 this 一个。

或者,如果您想与 client/server 进行更简单的集成,您可以尝试 Node.js 来实现您的服务器逻辑并使用 Socket.io library to handle communication, which will also handle incompatible browsers gracefully. Note that Socket.io uses a different protocol,所以如果您想避免做很多额外的工作,我不建议尝试将它与您当前的 C++ 服务器一起使用。

总结一下

原始 (TCP) 套接字

  • 优点:更容易与您当前的 C++ 服务器集成
  • 缺点: 不能保证浏览器支持,不是(网络)标准,需要更多的同步、通信等工作。

网络套接字

  • 优点: 性能与 TCP 套接字相当,更容易实现客户端
  • 缺点:您可能需要在服务器实现上做更多工作

我个人的建议是尽可能避免使用 TCP 套接字并遵守标准。

编辑: 显然,TCP 套接字 might 最终成为 W3C 标准,API 仍然是草案(而且是最近的草案),所以我仍然建议不要使用它们(最新的 Chrome 有实验性实现)。

我认为@Sosdoc 给出了正确的答案。我唯一想补充的是,像 SignalR 这样的库可以帮助您实现 websockets。您可能想查看 github 上的 c++ signalr-qt 项目:https://github.com/p3root/signalr-qt