【问题标题】:Can socket.io work across domains?socket.io 可以跨域工作吗?
【发布时间】:2014-09-12 01:29:33
【问题描述】:

我有一个 socket.io 实现,我试图让它跨域工作,但它似乎不能。这是我的确切用例:

  • 我有一个运行 socket.io 的 node.js 服务器。
  • 我有一个 JS / HTML5 游戏,我希望能够从任何地方托管它,它具有客户端 socket.io 代码并尝试连接到服务器。
  • 我通过 SpiderMonkey 在移动设备上运行相同的 JS 代码(这是我需要从任何域运行它的主要原因之一)。

我发现我根本无法连接到套接字,除非我将 JS 代码从我的 node.js 服务器提供给浏览器。例如,如果我只是从浏览器中打开磁盘上的 HTML 文件,它将无法正常工作。

服务器代码:

io.on( "connection", function( socket )
    {
        this.socket = socket;
        this.socket.on( "echo", function( str ){ this.socket.emit( "message", str ); }.bind( this ) );
    }.bind( this ) );

客户端代码:

this.socket = io.connect( ip );
this.socket.on("message", function( str ) { console.log( str ); } );

我什至无法连接,我打印出它正在尝试连接,但它从未成功,然后开始抛出 ping 错误。那么,这甚至可能吗?还是我必须通过长轮询或其他方式来做到这一点?

错误:

[Error] Failed to load resource: A server with the specified hostname could not be found. (socket.io, line 0)

额外信息: 如果我尝试从使用 file:/// 从磁盘打开的 HTML 文件进行连接,这将特别不起作用。我将尝试在同一网络上的不同机器上...

【问题讨论】:

  • 听起来ip 无效。它设置为什么?开发工具网络选项卡说请求发生了什么?
  • 尝试访问你的URL,直接在browser,看看是不是connects。如果确实如此,那么这可能是一些握手问题......
  • IP 为 localhost:13375。如果我创建一个 index.html,我就可以从我的浏览器连接到它。
  • 如果你的 node.js 服务器可以监听传入的连接,为什么它不能同时为客户端提供 socket.io.js 脚本?
  • 因为我正在通过 Spidermonkey 在移动设备上运行应用程序,所以据我所知,唯一的方法是通过网络视图来实现。

标签: javascript html node.js sockets socket.io


【解决方案1】:

是的,Socket.IO 可以跨域工作。实际的 Socket.IO 库可以/应该从托管它的服务器加载。

额外信息:如果我尝试从使用 file:/// 从磁盘打开的 HTML 文件进行连接,这将不起作用。

不要那样做。在从磁盘加载文件与通过 HTTP 加载文件时,您会遇到各种奇怪的问题。

加载资源失败:找不到具有指定主机名的服务器。

这通常意味着您尝试连接的任何主机名都无法解析,这表明存在 DNS 问题或您输入了主机名。在任何情况下,您的代码示例都没有显示问题所在的相关部分。使用浏览器的开发人员工具首先确定一切都正确加载。然后,验证您尝试连接的地址。

【讨论】:

  • 是的,我做了一个测试,我从托管的 Web 服务器(而不是文件:///)运行 socket.io,它运行良好。现在我需要看看这是否可以与 Spidermonkey 一起使用......
猜你喜欢
  • 2013-08-11
  • 2014-06-07
  • 2015-01-11
  • 2017-12-31
  • 2015-04-10
  • 2019-07-04
  • 2017-03-06
  • 2014-06-30
  • 1970-01-01
相关资源
最近更新 更多