我想编写一个将带有node.js和socket.io的WebSockets与Django结合使用的应用程序,并将通过Redis共享数据(该句中有很多流行语!)。
如果我在另一个端口(例如5555)上运行节点,我是否可以使用WebSocket(或使用socket.io的后备方法,如长轮询等)连接到该节点,或者same origin policy给我带来问题?
如果是这样,我怎么能绕过它们呢?
答案 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会给你带来问题。 我相信它可以通过使用服务器端反向代理来解决。