【问题标题】:Can WebSockets (or AJAX long-polling, etc.) run on a different port than the original HTTP request?WebSockets(或 AJAX 长轮询等)可以在与原始 HTTP 请求不同的端口上运行吗?
【发布时间】:2011-07-18 17:45:18
【问题描述】:

我想编写一个应用程序,将 WebSockets 与 node.js 和 socket.io 与 Django 结合使用,并将通过 Redis 共享数据(这句话中有很多流行语!)。

如果我在不同的端口(例如 5555)上运行节点,我是否能够使用 WebSocket 连接到它(或使用 socket.io 的后备方法,如长轮询等)或 @987654322 @给我问题?

如果是这样,我该如何绕过它们?

【问题讨论】:

    标签: ajax node.js socket.io


    【解决方案1】:

    Socket.io 支持 JSONP 轮询,这通常用于跨域长轮询(除了 CORS 并非每个浏览器都支持)。关于 WebSockets 的跨域主题 - specification 声明如下:

    服务器将主机名包含在 |Sec-WebSocket-位置|场地 它的握手,使两者 客户端和服务器可以验证 他们同意哪个主机在 使用。

    您“应该”能够使用具有不同端口的 WebSocket,实际上您可能别无选择,因为其他 Web 服务器将使用 80 等标准端口来为您的基于 Django 的应用程序提供服务。如果您使用相同的域和端口,特定于浏览器的parallel connection limits 也会存在潜在问题(例如,当您尝试在同一浏览器上下文中打开多个选项卡时,您可以在 Facebook 聊天中看到这一点 - 每个选项卡都连接到在长轮询期间使用不同的子域来克服这些限制)。

    【讨论】:

      【解决方案2】:

      答案是“有时”。它非常特定于浏览器和安全策略。

      假设您使用的是 Socket.IO... 我没有遇到任何问题,除了在 Opera 中它无法绕过 SOP(同源策略)规则。修复是启用 WebSockets。

      【讨论】:

        【解决方案3】:

        socket.io 确实支持跨域连接(请参阅常见问题解答)。不同的端口可以正常工作。

        【讨论】:

          【解决方案4】:

          我不确定 WebSockets,尽管 Ajax 会给您带来问题。 我相信这可以通过使用服务器端的反向代理来解决。

          【讨论】:

          • 关于如何绕过它们的任何想法?
          • 在不同的端口上进行 AJAX 调用,或者设置它以便我可以将特定请求路由到正确的服务器?
          • @Ankit 使用反向代理怎么样?
          • WebSockets 不是 HTTP 请求,所以通过 nginx 代理它们是行不通的。
          • @Ankit 他们使用 HTTP 请求进行握手。我不知道细节,因为我从未使用过 WebSockets。
          猜你喜欢
          • 2015-06-12
          • 2013-08-11
          • 2012-07-07
          • 2013-01-10
          • 1970-01-01
          • 1970-01-01
          • 2012-03-27
          • 2018-01-03
          • 1970-01-01
          相关资源
          最近更新 更多