WebSockets(或AJAX长轮询等)可以在与原始HTTP请求不同的端口上运行吗?

时间:2011-03-19 12:36:33

标签: ajax node.js socket.io

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

如果我在另一个端口(例如5555)上运行节点,我是否可以使用WebSocket(或使用socket.io的后备方法,如长轮询等)连接到该节点,或者same origin policy给我带来问题?

如果是这样,我怎么能绕过它们呢?

4 个答案:

答案 0 :(得分:5)

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

  

服务器包含主机名   | Sec-WebSocket-Location |领域   它的握手,这两个   客户端和服务器可以验证   他们同意哪个主持人在   使用

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

答案 1 :(得分:3)

答案是“有时”。它的浏览器和安全策略非常具体。

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我不确定WebSockets,虽然Ajax会给你带来问题。 我相信它可以通过使用服务器端反向代理来解决。