我有nodejs進程A和nodejs進程B。進程A在9000端口開了一個httpserver。進程B不斷嘗試綁定9000端口,并且由于端口已被占用而失敗。這很正?!,F(xiàn)在進程A想要釋放綁定的9000端口以使得進程B可以綁定??墒沁M程A不能退出。該如何做到呢?補充@Larvata感謝你,你的代碼是能夠釋放原端口的。我發(fā)現(xiàn)是我錯誤的描述了我的問題,補充如下:我在windows上使用nodeJS啟動一個http服務(wù)A。為了防止它掛掉,我啟動了一個后備的http服務(wù)B,服務(wù)B會不斷的嘗試綁定同一個端口。如果http服務(wù)A因為某種原因退出了進程,那么服務(wù)B就會拿到那個端口的控制權(quán),以替代http服務(wù)A。這個過程我可以通過代碼完成。然后我嘗試將這個手動過程寫入代碼。代碼會不斷嘗試綁定9000端口,綁定成功則提供http服務(wù),并且開一新的進程,啟動同一套代碼:不斷嘗試綁定9000端口,綁定成功則代替前一個服務(wù),并且開一個新的進程……也就是進程A會開啟進程B作為備胎,當進程A掛掉以后進程B會轉(zhuǎn)正,并且開啟進程C作為備胎……由于開啟的備胎顯然不能隨主進程掛掉而一起掛掉,所以有兩種開啟方法:1.通過windows的"startnodexxx.js"命令啟動2.通過cp.spawn的detached模式啟動備胎啟動很順利,但是遇到的問題是,進程A掛掉的時候,并沒有將9000端口給釋放,所以進程B一直無法綁定9000端口。端口只有當進程B也掛掉的時候才會被釋放。但是我覺得這是說不通的,端口9000應(yīng)該跟進程A一起釋放才對,這種情況更像是一種portleak。因為實際中無法決定進程A是怎么掛掉的,所以進程A不能主動關(guān)閉端口,所以我之前的問題歸納出現(xiàn)了問題。。。附可執(zhí)行代碼(windowsonly)varexpress=require('express');varhttp=require('http');varapp=express();varcp=require('child_process');varserver=http.createServer(app);server.setTimeout(1000);server.on('error',function(){console.log("Error:",arguments);setTimeout(tryToConnect,3000);});server.on('listening',function(){console.log("Listening");//varchild=cp.spawn('node',['donoting.js'],{//detached:true,//stdio:['ignore','ignore','ignore']//});//child.unref();cp.exec('startnodelisten.js');});vartryToConnect=function(){varport=9000;console.log("Tryingtoconnecttoport",9000);server.listen(9000);};tryToConnect();代碼應(yīng)該達到的效果,應(yīng)該是啟動另一個窗口,然后當你把第一個關(guān)掉以后,新窗口中啟動的程序取代關(guān)掉的程序。
nodejs中如何解除已綁定的端口
翻翻過去那場雪
2019-04-13 08:46:41