raceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "/usr/lib/python3.11/http/server.py", line 1313, in <module> test( File "/usr/lib/python3.11/http/server.py", line 1260, in test with ServerClass(addr, HandlerClass) as httpd: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/socketserver.py", line 456, in __init__ self.server_bind() File "/usr/lib/python3.11/http/server.py", line 1307, in server_bind return super().server_bind() ^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/http/server.py", line 136, in server_bind socketserver.TCPServer.server_bind(self) File "/usr/lib/python3.11/socketserver.py", line 472, in server_bind self.socket.bind(self.server_address) OSError: [Errno 98] Address already in use
时间: 2025-05-26 08:12:45 浏览: 28
### 一、问题分析
当尝试启动 Python 的内置 HTTP 服务器时,如果遇到 `OSError: [Errno 98] Address already in use` 错误,这表示目标 IP 地址和端口已经被其他进程占用。HTTP 服务器默认监听特定的网络接口和端口号(通常是 localhost 和某个自定义端口)。因此,需要释放被占用的资源或将新服务绑定到不同的地址/端口组合。
---
### 二、解决方案
#### 1. **查找并终止占用端口的进程**
可通过以下命令查看哪个进程占用了指定端口,并结束该进程来解决问题:
- 使用 `netstat` 或者更现代化的替代工具如 `ss` 来识别具体的 PID:
```bash
sudo ss -tuln | grep ':<port>'
```
将 `<port>` 替换为实际冲突的端口号,比如 `8000`。上述命令会列出所有处于监听状态的服务及其对应的程序 ID(PID)[^1]。
- 获取到确切的 PID 后,强制停止这个进程:
```bash
sudo kill -9 <PID>
```
#### 2. **修改 HTTP Server 绑定的端口**
如果不想干扰现有运行的应用程序,可以选择更改新建 HTTP server 实例所使用的端口号码。例如,在调用标准库函数创建实例的时候传递新的参数值:
```python
import http.server
import socketserver
PORT = 8080 # 更改此处为你希望的新端口号
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print(f"Serving at port {PORT}")
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
```
#### 3. **启用 SO_REUSEADDR 参数**
在某些情况下,即使关闭了之前的连接,操作系统仍然会在一段时间内保留套接字的状态(TIME_WAIT 状态),阻止立即重用相同的地址和端口对。为了绕过这种限制,可以在初始化 TCP 服务器对象之前设置其允许重复使用地址属性:
```python
import http.server
import socketserver
import socket
class ReusableTCPServer(socketserver.TCPServer):
allow_reuse_address = True
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
with ReusableTCPServer(("", PORT), Handler) as httpd:
print(f"Serving at port {PORT}")
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
```
#### 4. **检查防火墙或其他安全软件的影响**
偶尔也会因为系统级的安全策略导致看似可用但实际上受限的行为模式。建议临时禁用防火墙测试效果或者添加例外规则让指定范围内的流量得以通行无阻[^2]。
---
### 三、总结
综上所述,面对 `OSError: [Errno 98] Address already in use` 的情况可以从以下几个方面入手:一是清理遗留进程;二是调整自身应用配置避开竞争区域;三是优化协议栈行为适应复杂环境下的需求变化。
---
阅读全文
相关推荐












