我想编写一个应用程序,将 WebSockets 与 node.js 和 socket.io 与 Django 结合使用,并将通过 Redis 共享数据(这句话中有很多流行语!)。
如果我在不同的端口(例如 5555)上运行节点,我是否能够使用 WebSocket(或使用socket.io的后备方法,如长轮询等)连接到它,或者相同的来源策略是否会给我问题?
如果是这样,我该如何绕过它们?
Socket.io 支持 JSONP 轮询,这通常用于跨域长轮询(除了不是每个浏览器都支持的CORS )。关于 WebSockets 的跨域主题 -规范声明如下:
服务器在 |Sec-WebSocket-Location| 中包含主机名 它的握手字段,以便客户端和服务器都可以验证它们是否同意使用哪个主机。
您“应该”能够使用具有不同端口的 WebSocket,实际上您可能别无选择,因为其他 Web 服务器将使用像 80 这样的标准端口来为您的基于 Django 的应用程序提供服务。如果您使用相同的域和端口,浏览器特定的并行连接限制也会存在潜在问题(例如,当您尝试在同一浏览器上下文中打开多个选项卡时,您可以在 Facebook 聊天中看到这一点 - 每个选项卡都连接到长轮询期间使用不同的子域来克服这些限制)。
答案是“有时”。它非常特定于浏览器和安全策略。
假设您使用的是 Socket.IO... 我没有遇到任何问题,除了在 Opera 中它无法绕过 SOP(同源策略)规则。修复是启用 WebSockets。
socket.io确实支持跨域连接(参见常见问题解答)。不同的端口可以正常工作。
我不确定 WebSockets,尽管 Ajax 会给你带来问题。我相信它可以通过使用服务器端的反向代理来解决。