Python Socket服务端出现utf-8解码0xbc错误导致服务中断如何解决
问题根因
- 解码错误本质:客户端发送的字节流不是标准UTF-8编码,或者连接中断、传输异常导致收到的字节序列不完整,直接调用
decode()默认会严格校验编码合法性,不合法就抛出UnicodeDecodeError - 服务崩溃原因:没有对单连接的处理逻辑做异常捕获,单个连接的错误直接击穿到最外层循环,导致整个服务终止
代码修复方案
直接修改代码,新增异常捕获逻辑+解码容错处理,确保单连接异常不会影响全局服务,修改后代码如下:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print("Socket Created...") server = '' port = 5555 s.bind((server, port)) print(socket.gethostbyname(socket.gethostname())) s.listen(8) print("Waiting for connections.") while True: c, addr = s.accept() print("Connected with ", addr) try: raw_data = c.recv(1024) # 解码加容错,errors可选ignore/backslashreplace/replace,根据业务需要选 gamemodename = raw_data.decode('utf-8', errors='replace') # 这里也可以加非空校验,避免空包导致后续逻辑报错 if not gamemodename.strip(): print(f"Empty data from {addr}, close connection") c.close() continue # 原有后续业务逻辑放这里 except Exception as e: # 捕获所有单连接相关异常,打印日志不中断服务 print(f"Error handling connection from {addr}: {str(e)}") finally: # 确保不管是否报错都关闭连接,避免文件描述符泄漏 c.close()
解码容错参数说明:
errors='ignore'会直接跳过无法解码的字节,errors='replace'会用�替换无法解码的字符,errors='backslashreplace'会用转义序列显示异常字节,可根据业务场景选择。
服务自动重启方案
如果想要实现即使服务意外崩溃也能自动恢复,可选择以下任意一种方案:
方案1:Systemd托管(推荐,Ubuntu系统原生支持)
- 新建配置文件
/etc/systemd/system/ubs-server.service,内容如下:
[Unit] Description=UBS Game Server After=network.target [Service] User=root WorkingDirectory=/root/UBS-server ExecStart=/usr/bin/python3 server.py Restart=always RestartSec=2 [Install] WantedBy=multi-user.target
- 执行命令启动服务并设置开机自启:
systemctl daemon-reload systemctl enable --now ubs-server
- 查看运行日志命令:
journalctl -u ubs-server -f
方案2:简单循环脚本(适合tmux临时运行)
在tmux窗口中新建run.sh脚本,内容如下:
#!/bin/bash cd /root/UBS-server while true do python3 server.py echo "服务 crashed,1秒后自动重启..." sleep 1 done
给脚本加执行权限后运行即可:chmod +x run.sh && ./run.sh
内容的提问来源于stack exchange,提问作者Stash
相关产品推荐
相关产品推荐

