You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python WebSocket API运行报错[Errno 98],请求技术排查

搞定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

火山引擎 最新活动