基于回合的游戏服务器的websockets和长轮询之间的差异

aci*_*dic 75 rest web-services long-polling websocket ios

我正在为iOS游戏编写服务器.游戏是基于回合的,并且服务器将信息推送到客户端的唯一时间是通知对手的移动.

我很好奇是否有人可以评论使用websockets和长轮询之间的性能和易于实现的差异.另外,如果我使用websockets,我应该只使用它来接收信息并发送其他所有的POST请求,还是应该通过websocket进行所有通信?

另外,如果我有兴趣创建一个Web客户端,那么在websockets和长轮询之间还有什么需要考虑的吗?

Tha*_*rif 149

什么是长轮询?

在此输入图像描述 传统轮询技术的一种变体,允许模拟从服务器到客户端的信息推送.通过长轮询,客户端以与普通轮询类似的方式从服务器请求信息.

  • 如果服务器没有可用于客户端的任何信息,则服务器保留请求并等待某些信息可用,而不是发送空响应.
  • 一旦信息可用(或在适当的超时之后),就会向客户端发送完整的响应.然后,客户端通常会立即从服务器重新请求信息,这样服务器几乎总会有一个可用的等待请求,它可以用来传递数据以响应事件.

    在web/AJAX上下文中,长轮询也称为Comet编程.

Websockets怎么样?

在此输入图像描述 WebSockets提供客户端和服务器之间的持久连接,双方可以使用它始终开始发送数据.

  • 客户端通过称为WebSocket握手的进程建立WebSocket连接.此过程从客户端向服务器发送常规HTTP请求开始.
  • 此请求中包含一个Upgrade头,通知服务器客户端希望建立WebSocket连接.

结论:

如果需要实时通信,您可以选择websockets.

但在Long Polling中:

Web客户端和Web服务器之间保持连接,以便在服务器有新信息时将其推送到客户端.然后该请求就完成了.然后在客户端和服务器之间进行新请求,然后等待来自服务器的另一个更新.由于HTTP/1.1保持活动,相同的TCP连接通常在多个请求中持续打开.

参考和其他考虑因素:

PubNub长轮询与套接字 - 移动电池续航时间

什么是长轮询,Websockets,服务器发送事件(SSE)和Comet?

目标C中的长轮询

Websocket简介

Websocket与长轮询

在Apps中使用Websockets

Websocket应用程序

PushTechnology-Long Polling


Ada*_*och 6

对于其他可能想知道的人来说,这可能取决于事件之间典型的交互持续多长时间?

Websocket:任何超过几十秒的时间,我不认为保持 websocket 打开特别有效(更不用说 IIRC,如果应用程序失去焦点,它无论如何都会断开连接)

长轮询:这迫使服务器负载(现在有什么新的吗?现在怎么样?...)和了解发生变化的速度之间进行权衡。

推送通知:虽然这在技术上实现起来可能更复杂,但在我看来,这确实是最好的解决方案,因为:

  • 事件发生后几乎可以立即发送(和传递)通知
  • 没有standby服务器负载(无论是来自开放的 websockets,还是“现在怎么样?”查询)——随着您的使用基础的增长,这一点尤其重要
  • 您可以覆盖当用户在应用程序内时收到通知时发生的情况