【问题标题】:Why pubnub javascript sdk (?) choses XHR over Websocket?为什么 pubnub javascript sdk (?) 选择 XHR 而不是 Websocket?
【发布时间】:2015-01-01 12:42:03
【问题描述】:

我正在开发简单的浏览器实时多人游戏(游戏 atm 中有 2 个玩家)游戏。它涉及快速和频繁的玩家移动和方向变化,因此必须非常快速地交换信息 - 我决定尝试 websockets(很乐意使用 pubnub 服务而不是自托管套接字服务器)。

我的问题是,pubnub 总是决定使用 xhr 后备而不是 websockets - 不知道为什么。是否有任何特定要求必须满足才能通过 websockets 运行通信? Http显然太慢了,扼杀了体验。我在 Mac 上使用最新的 Chrome,所以浏览器兼容性不是问题。

或者,决定通信协议的变量太多,无法回答这个问题?而我唯一的解决方案是使用自托管套接字服务器?

【问题讨论】:

    标签: javascript websocket real-time multiplayer pubnub


    【解决方案1】:

    带有 PubNub 的实时协议 WebSockets 和 XHR

    现代数据流网络和开源解决方案始于 XHR。出于多种原因,这是从包括速度开始的最佳选择。性能取决于光速以及以太网帧能够在互联网上的设备之间传输的速度。这是协议独立性的基础,也是互联网上消息延迟和速度的核心决定因素。 PubNub 客户端 SDK,例如 JavaScript,不提供强制使用特定协议的设置。

    PubNub 的工作原理

    请参阅How PubNub Works 向下滚动鼠标演示。

    PubNub 是当今最快的全球数据流网络,在全球拥有 15 个数据中心,可满足您的高速和低延迟要求。连接到 PubNub 数据流网络的超过 1/4 亿台设备的发送/接收速度从每条消息 10 毫秒到 100 毫秒不等。

    什么是协议独立性?

    PubNub 数据流网络背后的人们相信Protocol Independence and the open mobile web;这意味着我们将使用最好的协议在任何环境中获得连接。诸如 WebSockets 之类的协议可能会被信号塔切换、双 NAT 环境,甚至一些防病毒软件或代理边界机构所绊倒。

    PubNub 专门提供客户端库,因此我们可以自动切换协议并消除套接字级别的复杂性,使开发人员可以轻松构建可以实时通信的应用程序。

    随着时间的推移,PubNub 使用了多种协议,例如 WebSockets、MQTT、COMET、BOSH、long polling 等,我们正在探索目前使用的原型设计未来的设计SPDY、HTTP 2.0 等。最重要的是,PubNub 可以在任何网络环境中运行,并且网络带宽开销非常低,并且移动设备的电池消耗也很低。

    【讨论】:

    • 感谢您的回答。我得到了协议独立的想法(这很酷)和 pubnub 的卓越性能。不过,我所需要的只是“你不能为你的应用程序强制 websockets 连接,而 xhr 是我们的主要协议 atm”。该项目是实验性的(非商业性的),所以我会将 pubnub 与自托管的 websockets(甚至可能是 WebRTC 技术)进行比较,然后选择性能最佳的选项。
    • 我更新了答案以包括“没有强制执行特定协议的选项”。此外,所有非商业的开源项目都有资格在 PubNub 上使用免费模式 - pubnub.com/free-evangelism-program
    • PubNub,我遇到了与@Vincentos 相同的问题,并且查看了 JS SDK (pubnub-3.7.18.js) 的源代码,其中甚至没有任何代码可以使用本机 WebSockets .整个事情只是 XHR/XDR/Flash 长轮询之上的一个虚假且稍微不准确的 WebSocket 接口。然后我重新阅读了您的营销材料,并意识到您只声称支持类似于 polyfill WebSocket API 的东西,而您似乎并不支持大多数人认为真正的 WebSockets!
    • @PubNub,补充一下我之前的评论,PubNub 在 Javascript 中实现长轮询的方式意味着每次服务器推送数据时该连接都会关闭并重新打开。然后再加上一个事实,即客户端要推送数据,它必须发送自己的常规 GET 请求。这两种情况都会导致可怕的延迟(50-300 毫秒)和高带宽使用,这使得 PubNub 不适合快速嘈杂的应用程序,例如本问题中提到的游戏。您似乎支持其他语言的持久双向连接,所以我不确定您为什么不使用 Javascript。
    • @KyleMacFarlane 谢谢你的提问! PubNub TCP 套接字 TTL 策略是无限,并且将永远保持打开状态。除了一些用于通过 WAN 向移动设备传递可靠信号的标准机制外,PubNub 还具有专有的默认消息传递机制。 TCP Socket 永远保持打开状态,不会关闭。我们的运输方式很难使用标准工具进行测量。您可以通过在同一个客户端上发送/接收一堆消息来自己构建速度测试。
    【解决方案2】:

    您还可以尝试使用 WebSockets 作为首选协议(带有 XHR 回退)的其他云服务,例如 PusherRealtime(我工作的公司)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-05
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      相关资源
      最近更新 更多