Python Websockets服务器wss连接失败:出现EOFError("line without CRLF")错误
解决Websockets服务器
EOFError("line without CRLF")问题 这个错误的核心是Websocket握手阶段的HTTP头不符合协议规范——Websocket握手基于HTTP协议,要求每个头字段必须以\r\n(CRLF)结尾,若服务器收到的请求头缺少该格式,或数据传输中断导致内容不完整,就会触发该错误。针对wss连接场景,可按以下方向排查修复:
检查TLS证书与配置
- 确保服务器使用的TLS证书完整有效(包含链式证书),wss依赖TLS加密,证书异常会导致握手数据传输紊乱
- 若使用
websockets库搭建wss服务器,确认代码正确加载证书文件,示例代码:import asyncio import websockets import ssl ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ssl_context.load_cert_chain(certfile="fullchain.pem", keyfile="privkey.pem") async def handler(websocket): # 业务处理逻辑 pass async def main(): async with websockets.serve(handler, "0.0.0.0", 9000, ssl=ssl_context): await asyncio.Future() # 保持服务运行 asyncio.run(main())
验证握手数据格式
- 检查自定义握手逻辑是否遗漏了
\r\n结尾,确保响应头严格遵循HTTP规范 - 若用反向代理(如Nginx)转发wss请求,确认代理配置未修改HTTP头格式,Nginx配置示例:
注意:代理不可截断或修改请求/响应头的换行符location /ws { proxy_pass http://localhost:9000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; }
排查网络层问题
- 检查服务器9000端口的防火墙规则,确保允许双向TCP流量,避免数据包被中途截断
- 先测试无加密的ws连接(
ws://myserver.com:9000),若ws能正常工作,说明问题集中在TLS配置或wss加密传输环节
升级websockets库版本
- 旧版本
websockets库可能存在握手格式相关bug,执行pip install --upgrade websockets升级到最新稳定版后重新测试
内容的提问来源于stack exchange,提问作者Larry K
相关产品推荐
相关产品推荐

