node检测端口是否被占用isPortOccupied.js
Posted luffy5459
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node检测端口是否被占用isPortOccupied.js相关的知识,希望对你有一定的参考价值。
如题所示,node开发中,可能会遇到开启tcp/http服务端口被占用的问题,解决起来也很简单,直接换一个端口就可以了。但是每次启动,发现失败,然后更改监听端口来测试,也很麻烦。
本文介绍的办法,也是一种通用的办法,端口如果没有被占用,就用该端口,如果端口被占用,一般端口参数是整数,这个时候+1,变更端口,再监听,直到没有被占用,就使用该端口。
比如,我们监听8080,发现没有监听,那么使用8080。如果被监听,那么使用8081端口,再不行,使用8082,直到端口可用。
portIsOccupied.js使用Promise的思想,监听指定端口,如果监听成功,那么表示该端口没有被占用,取消监听,返回端口给调用者。如果监听出现错误,则将端口+1,继续递归调用监听,直到监听成功,取消监听,将可用端口号返回给调用者。调用者拿到合适的端口,开启自己的监听服务。就解决了靠自己手动修改端口号去盲试的问题。
const net = require('net')
export function isPortOccupied(port)
var server = net.createServer().listen(port)
return new Promise((resolve,reject)=>
// 如果监听成功,表示端口没有被其他服务占用,端口可用,取消监听,返回端口给调用者。
server.on("listening",()=>
console.log('the server is running on port '+port)
server.close()
resolve(port)
)
// 如果监听出错,端口+1,继续监听,直到监听成功。
server.on("error",(err)=>
if(err.code === 'EADDRINUSE')
resolve(isPortOccupied(port+1))
console.log('this port '+ port+' is occupied try another.')
else
reject(err)
)
)
在调用的地方,可以这样来操作:
isPortOccupied(8000).then(port=>
httpServer.listen(port,function()
logger.main.info("http server listening at port "+port)
)
)
关于端口占用问题,我们这里不能直接把占用端口的进程杀死,有可能是别的服务,所以发现被占用,是更换一个端口,今天介绍的这种办法采用+1的办法来更换端口号,最终一定可以得到一个可用的端口。
以上是关于node检测端口是否被占用isPortOccupied.js的主要内容,如果未能解决你的问题,请参考以下文章