node检测端口是否被占用isPortOccupied.js

    如题所示,node开发中,可能会遇到开启tcp/http服务端口被占用的问题,解决起来也很简单,直接换一个端口就可以了。但是每次启动,发现失败,然后更改监听端口来测试,也很麻烦。

    本文介绍的办法,也是一种通用的办法,端口如果没有被占用,就用该端口,如果端口被占用,一般端口参数是整数,这个时候+1,变更端口,再监听,直到没有被占用,就使用该端口。

    比如,我们监听8080,发现没有监听,那么使用8080。如果被监听,那么使用8081端口,再不行,使用8082,直到端口可用。

    isPortOccupied.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的办法来更换端口号,最终一定可以得到一个可用的端口。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值