2012-01-20 30 views
1

我正在處理與另一個節點應用程序交互的測試工具,並驗證其他應用程序是否正常工作。我需要能夠在兩個不同的端口上偵聽兩個不同的協議,在node.js中的同一個進程中。具體來說,我攔截了一個簡單的換行符文本協議(acceptorone)和HTTP請求(acceptortwo)。是否有可能在單個node.js進程中監聽兩個net.createServer()?

目前,我有這樣的:

var acceptorone = net.createServer(); 
acceptorone.listen(portone); 
var acceptortwo = http.createServer(); 
acceptortwo.listen(porttwo); 

然而,當我嘗試這個,我得到Error: listen EADDRINUSE。這兩個代碼路徑都可以獨立工作,如果其中一個listen()被註釋掉了,那麼一切都很好。

谷歌搜索一下會產生一個解決方案,涉及幾個進程。但是,這是在測試框架中運行的,所以我需要將所有內容都放在同一個進程中。諸如statsd之類的應用程序不會同時接受TCP和UDP連接,所以我不確定爲什麼同時監聽多個TCP套接字會受到限制。任何人都可以解釋這個問題嗎?謝謝。

回答

3

我認爲別的東西必須與你的榜樣打破;你能告訴你如何初始化portoneporttwo

$ cat servers.js 
#!/usr/bin/node 
net = require('net') 
http = require('http') 

portone=10000 
porttwo=10001 

var acceptorone = net.createServer(); 
acceptorone.listen(portone); 
var acceptortwo = http.createServer(); 
acceptortwo.listen(porttwo); 
$ ./servers.js & 
[1] 6894 
$ netstat -anp | grep node 
(Not all processes could be identified, non-owned process info 
will not be shown, you would have to be root to see it all.) 
tcp  0  0 0.0.0.0:10000   0.0.0.0:*    LISTEN  6894/node  
tcp  0  0 0.0.0.0:10001   0.0.0.0:*    LISTEN  6894/node  
$ 
+0

啊哈!由於這是在一個測試框架中,服務器正在被反覆創建和銷燬。我只接近一個接受者,而不是兩個接受者。這導致了我看到的EADDRINUSE。謝謝你的幫助! – wickedchicken

+0

優秀;我認爲你應該在自己的權利中加上一個答案,以便未來的訪問者能夠更輕鬆地找到這些信息:_Beware your testing infrastructure_。 :) – sarnold

相關問題