Socket.IO IPv6(2013年1月版)

时间:2013-01-06 18:33:18

标签: node.js socket.io ipv6

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

一年前,这个didn't seem possible due to the address parsing与客户。现在好像是at least one person has gotten it working

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

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

而且,在客户端:

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

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

我还注意到,如果我在Chrome中转到http://[::1]:8124/,我就不会得到通常的“欢迎使用socket.io。”,调试消息。奇怪的是,如果我去http://127.0.0.1:8124/,我确实得到了这条消息,尽管告诉服务器只能听::1

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

1 个答案:

答案 0 :(得分:2)

尝试

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

或(获取调试消息):

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/)和nodejs:

测试了它
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模块(至少是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)支持url解析器中的文字ipv6地址,因此支持xmlhttprequest。