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的主要内容,如果未能解决你的问题,请参考以下文章

node服务端口被占用

Linux检测端口是否被防火墙禁止或端口是否被占用

Linux运维:检测端口是否被防火墙禁止或端口是否被占用

Node端口占用处理(throw er: // Unhandled 'error' event)

Linux如何查询哪些端口被占用

Linux如何查询哪些端口被占用