【问题标题】:Socket.IO IPv6 (January 2013 Edition)Socket.IO IPv6(2013年1月版)
【发布时间】:2013-01-16 22:38:28
【问题描述】:

我需要使用 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? 如果可以,如何使用?

【问题讨论】:

    标签: node.js socket.io ipv6


    【解决方案1】:

    试试

    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 中也支持。

    【讨论】:

    • 谢谢斯特凡。这似乎使服务器正常运行,但我无法从客户端连接到它。没有输出错误...不知道为什么。你能从 Node.js 客户端连接到服务器吗?
    • @Brad hm,对 - 客户端看起来比服务器更坏。我更新了答案。
    • 如果您不能使用主机名 (dns) 而只能使用 IPv6 地址,是否有解决方案?服务器端的工作就像一个魅力,但客户端我经常遇到 XMLHTTPRequest 解析 IPv6 地址错误并且抱怨不允许跨域调用的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多