2013-01-06 78 views
1

我需要使用Socket.IO及其客戶端通過IPv6網絡在兩個Node.js服務器之間進行連接。Socket.IO IPv6(2013年1月版)

一年前,這個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使用的crash程序中的一個錯誤。)

我也注意到,如果我在Chrome中使用http://[::1]:8124/,我不會沒有平常的,「Welcome to socket.io。」,調試信息。奇怪的是,如果我去http://127.0.0.1:8124/,我確實得到了這條消息,儘管告訴服務器只能在::1上收聽。

從Socket.IO版本0.9.11開始,可以使用IPv6嗎?如果是這樣,怎麼樣?

回答

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

可悲的是它看起來像URL的NodeJS模塊(至少在Debian版本0.6.19)不支持文本地址,因此既做了XMLHttpRequest模塊:

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

的socket.io-客戶端模塊不支持文本地址要麼,但你可以欺騙它是這樣的:

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

這將使用XMLHttpRequest作爲後端的,因此它仍然無法正常工作的NodeJS(也許它與一個「真正的「瀏覽器中的XMLHTTPRequest對象或更新的節點j s版本)。

更新:最近的節點版本(試過v0.9.6-16-g9668df8)支持的URL語法分析器,因此在XMLHttpRequest的文字IPv6地址。

+0

謝謝Stefan。這似乎讓服務器去,但我無法從客戶端連接到它。沒有錯誤正在輸出......不知道爲什麼。你能否通過Node.js客戶端連接到服務器? – Brad

+0

@Brad hm,正確 - 客戶端看起來比服務器更壞。我更新了答案。 – Stefan

+0

按主機名工作!謝謝你的幫助! – Brad

相關問題