问题
运行python web服务器时,报错:OSError: [Errno 48] Address already in use
原因
你尝试绑定的网络地址(比如IP地址和端口号)已经被另一个进程占用。
解决办法
- Windows系统:
可以使用netstat
和taskkill
命令。假设你的Web服务器使用的是8000
端口,你可以按照以下步骤操作:
# 查找占用8000端口的进程ID
netstat -ano | findstr :8000
# 假设找到的进程ID是1234,使用taskkill命令终止该进程
taskkill /F /PID 1234
- Mac / Linux 系统:
可以使用lsof
命令来查找占用端口的进程,并使用kill
命令终止该进程。
# 使用lsof命令查找占用8000端口的进程ID
lsof -i:8000
# 假设找到的进程ID是1234,使用kill命令终止该进程
kill -9 1234
补充
如果你是用的socket
启动的服务器,执行kill
命令后或socket
关闭时,它可能会进入TIME_WAIT
状态,以确保所有的数据包都被正确处理。在这个状态下,端口仍然不能被立即重新使用。
解决办法
- 等待一段时间 :
TIME_WAIT
状态通常会持续几分钟,你可以等待一段时间(通常是几分钟),让端口自动释放。 - 修改服务器代码以允许重用地址:在创建
socket
时,可以设置SO_REUSEADDR
选项,这允许在同一端口上启动服务器的多个实例(只要它们不同时绑定)。亲测可用!
代码如下:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 8000))
Note:这主要用于服务器需要快速重启的场景,而不是解决端口被占用的问题!