Python WebSocket API运行报错[Errno 98],请求技术排查
嘿,咱们来解决你遇到的这个[Errno 98]问题——这个错误说白了就是你Python WebSocket API要绑定的端口已经被别的程序占了,结合你说的XAMPP在localhost:80运行,十有八九是端口冲突搞的鬼。下面给你一步步排查解决的办法:
1. 先检查WebSocket API的绑定端口
先看看你的Python代码里,WebSocket服务绑定的是哪个端口。比如如果代码里写了类似这样:
async def main(): async with websockets.serve(handler, "localhost", 80): await asyncio.Future() # 保持服务运行
那问题就很明显了——XAMPP的Apache已经占了80端口,两个程序不能同时用同一个端口。
解决方法很简单:把WebSocket API的端口改成其他没被占用的,比如8080、9000这类常用的备用端口:
async def main(): async with websockets.serve(handler, "localhost", 8080): await asyncio.Future() # 保持服务运行
改完代码别忘了同步更新你的.html文件里的WebSocket连接地址,比如:
const ws = new WebSocket('ws://localhost:8080');
2. 确认到底是谁占了端口
要是你不确定哪个进程占用了目标端口,可以用命令查清楚:
Windows系统:
打开命令提示符,运行:
netstat -ano | findstr :<你的端口号>
比如查80端口就输netstat -ano | findstr :80,结果里最后一列的数字就是进程ID(PID)。然后打开任务管理器,找到对应PID的进程结束它就行——不过如果是XAMPP的Apache,我更推荐你改WebSocket的端口,毕竟停了Apache你的静态页面就没法访问了。
Linux/macOS系统:
打开终端,运行下面任意一条命令:
lsof -i :<你的端口号> # 或者 netstat -tulpn | grep :<你的端口号>
比如lsof -i :80会显示占用端口的进程信息,之后用kill -9 <进程ID>就能结束进程——同样,优先改WebSocket端口更稳妥。
3. 端口复用(可选,不推荐)
如果你确实有特殊需求,必须让WebSocket API和其他程序共用同一个端口,可以在Python代码里设置端口复用选项。比如用websockets库的话,可以这么写:
import socket import websockets import asyncio async def handler(websocket): # 这里写你的WebSocket处理逻辑 pass async def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(("localhost", 80)) async with websockets.serve(handler, sock=sock): await asyncio.Future() asyncio.run(main())
不过这种方法可能会带来一些潜在的冲突问题,所以除非必要,还是用不同端口更省心。
最后提醒一下:改完端口后重启你的Python API,然后正常访问localhost:80打开.html页面,控制台应该就能正常和WebSocket通信啦!
内容的提问来源于stack exchange,提问作者Peter Holoubek




