1

IPv6 ネットワークを介して 2 つの Node.js サーバー間を接続するには、Socket.IO とそのクライアントを使用する必要があります。

1 年前は、クライアントとのアドレス解析が原因で、これは不可能に見えました。現在、少なくとも 1 人が動作しているようです。

そこで、サーバーでいくつかの簡単なテスト コードを試してみました。

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/');

my /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 に答える