Socket.IO IPv6(2013年1月版)

我需要使用Socket.IO及其客户端通过IPv6networking连接两个Node.js服务器。

一年前, 由于客户端的地址parsing ,这似乎不可能 。 现在看来, 至less有一个人已经得到了它的工作 。

所以,我在服务器上尝试了一些简单的testing代码:

var io = require('socket.io').listen(8124, '::1'); 

而且,在客户端:

 io.connect('http://[::1]:8124'); 

这失败了。 (没有错误输出,我现在正在调查,我认为这是我从winston使用的崩溃处理程序中的一个错误。)

我也注意到,如果我在Chrome浏览器中使用http://[::1]:8124/ ,我不会得到通常的“欢迎使用socket.io”debugging信息。 奇怪的是,如果我去http://127.0.0.1:8124/ ,我确实得到这个消息,尽pipe告诉服务器只侦听::1

从Socket.IO版本0.9.11开始,可以使用IPv6吗? 如果是这样,怎么样?

尝试

 var io = require('socket.io').listen(require('http').createServer().listen(8124, '::1')); 

或(获取debugging信息):

 var server = require('http').createServer().on('request', function (req, res) { res.writeHead(200); res.end('Welcome to socket.io.'); }).listen(8124, '::1'); var io = require('socket.io').listen(server); 

我用curl( curl -g http://[::1]:8124/ )和nodejstesting它:

 require("http").get({hostname:"::1", port:8124,path:"/"}, function(res) { console.log("Got response: " + res.statusCode); res.on("data",function(chunk) { console.log("BODY: " + chunk); }); }).on("error", function(e) { console.log("Got error: " + e.message); }); 

使用“真正的”主机名与客户端一起工作:

 require('socket.io-client').connect('http://ip6-localhost:8124/'); 

我的/ etc / hosts包含条目::1 ip6-localhost ,所以如果你有主机名只指向IPv6地址,这应该工作。 (如果第一个连接不起作用,则不会回退到另一个地址,因此使用localhost作为名称,不会从IPv4退回到IPv6)。

不幸的是,它看起来像nodejs的url模块(至less在debian版本0.6.19)不支持文字地址,因此也没有xmlhttprequest模块:

 console.log(require('url').parse('http://[::1]:8124/')); 

socket.io-client模块也不支持文字地址,但是你可以像这样来欺骗它:

 require('socket.io-client').connect('http://blank:8124/', {host:'[::1]'}); 

这将使用XMLHTTPRequest作为后端,所以它仍然不能用于nodejs(也许它在浏览器中的“真正的”XMLHTTPRequest对象,或更新的nodejs版本)。

更新更新的节点版本(尝试v0.9.6-16-g9668df8)支持urlparsing器中的文字ipv6地址,因此支持xmlhttprequest。