使用Python快速检测端口是否被占用的方法

40 投票
7 回答
65380 浏览
提问于 2025-04-15 20:34

我有一个用Python写的服务器,它会监听几个网络端口。在启动的时候,我会先尝试连接这些端口,以确保没有其他程序在使用这些端口。这一过程大约会让我的服务器启动时间增加三秒钟(如果不进行测试,启动时间大约是0.54秒),我想把这个时间缩短。因为我只是测试本地连接,所以我觉得50毫秒的超时时间已经足够了。不过,socket.setdefaulttimeout(50)这个方法似乎没有起作用,原因不太清楚。

我该怎么做才能缩短这个时间呢?

7 个回答

29

这里有一个例子,教你怎么检查一个端口是否被占用。

import socket, errno

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    s.bind(("127.0.0.1", 5555))
except socket.error as e:
    if e.errno == errno.EADDRINUSE:
        print("Port is already in use")
    else:
        # something else raised the socket.error exception
        print(e)

s.close()
83

要检查端口,可以使用:

def is_port_in_use(port: int) -> bool:
    import socket
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        return s.connect_ex(('localhost', port)) == 0

来源:https://codereview.stackexchange.com/questions/116450/find-available-ports-on-localhost

注意: 使用 connect_ex 可能仍然会出现异常(比如主机名不正确,具体可以查看文档 [1])。

[1] https://docs.python.org/3/library/socket.html

15

你可以试着直接绑定到你想要的端口,如果这个端口已经被占用了,就处理一下错误情况。
(如果你担心的是可能会启动同一个服务两次,那就别去看开放的端口。)

这样做也是个不错的方法,可以避免出现竞争条件,正如@eemz在另一个回答中提到的。

撰写回答