1

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

一年前,由于与客户端解析地址,这似乎是不可能的。现在看来,至少有一个人让它发挥了作用

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

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

而且,在客户端:

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

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

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

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

4

1 回答 1

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 中。

于 2013-01-15T11:18:31.403 回答