簡體   English   中英

Node.js listen()在server.close()之后拋出'EADDRINUSE'

[英]Node.js listen() throws 'EADDRINUSE' after server.close()

當不需要集群工作者釋放一些資源時,我試圖終止它們。 這是我在worker中使用的代碼:

server.on("close", function() {
    process.exit();
});
server.close();

當工作人員從主服務器獲取命令時,將執行此代碼。 調用了“關閉”回調,但是我無法訪問工作程序正在使用的任何端口。 所以我有這段代碼

var server = require('http').createServer(function(req, res) {
    res.writeHead(200);
    res.end('');
});
server.listen(8080);

而且,如果我在退出工作程序后重新啟動它,那么我將在8080端口上為listen()獲得“ EADDRINUSE”。

請運行此腳本以殺死與節點相關的進程。 然后再次運行您的代碼

(function(){
   "use strict";  
    var exec    = require('child_process').exec,
    lCmd    = 'kill -9'             +   ' ' + /* kill finded process */
              '`ps ax'              +   '|' + /* show all process    */
              'grep node-openshift' +   '|' + /* find node-openshift */
              'grep -v grep'        +   '|' + /* exlude grep command */
              'awk "{print $1}"`';            /* show first collumn  */

     exec(lCmd, function(error, stdout, stderr){
    console.log(error || stdout || stderr);
 }); 
})();

事實證明,Socket.io(正在監聽端口的內容)在終止之前不會釋放端口。 這樣做是為了允許端口重用。 我能夠使用與以前使用的端口完全相同的端口重新創建一個socket.io實例。 因此,如果使用端口8080進行與購物車的socket.io連接,使用端口8081進行建議的套接字,則下次創建購物車套接字實例時,必須調用listen(8080)

我想在不同的時間使用不同的端口進行不同的連接。 我試圖宣布可用的連接,但是我想我現在必須對不同服務的端口進行硬編碼。 至少EADDRINUSE不再顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM