socket.io可以跨域工作吗?

时间:2014-09-12 01:29:34

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

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

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

我发现除非我从我的node.js服务器向浏览器提供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文件进行连接,这将无法正常工作。我将在同一网络上尝试不同的机器......

1 个答案:

答案 0 :(得分:2)

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

  

EXTRA INFO:如果我尝试使用file:///从磁盘打开的HTML文件进行连接,则无法正常工作。

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

  

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

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