[英]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.