AWS部署多人游戏服务器遇OSError: [Errno 98]端口占用问题求助
问题分析与解决方案
一、解决「OSError: [Errno 98] Address already in use」
这个错误核心是绑定端口时端口已被占用,AWS环境下更容易触发,原因多为远程连接的TIME_WAIT状态持续时间更长,或旧服务进程未彻底退出。
给套接字添加复用选项
在创建套接字后、绑定端口前,加入以下代码:import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 允许复用处于TIME_WAIT状态的端口 server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 允许多个进程/线程绑定同一端口(适用于多进程架构) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) server_socket.bind(("0.0.0.0", 60000))确保连接关闭时释放资源
客户端断开后,必须调用socket.close()关闭对应套接字;如果用多线程/多进程处理客户端,要保证子线程/子进程退出时清理所有套接字资源。清理AWS服务器残留进程
登录AWS服务器,执行命令排查端口占用:lsof -i :60000 # 或备选命令 netstat -tulpn | grep 60000找到残留进程后强制终止:
kill -9 <进程ID>
二、解决「重建大厅时服务器崩溃,仅维持现有单客户端」
该问题多因大厅重启时,旧服务实例未彻底终止或资源未完全释放,导致新实例无法绑定端口或初始化资源。
重启前强制清理旧进程
在重建大厅的逻辑中,先检测并杀死占用60000端口的进程(Python脚本可通过subprocess调用命令行工具实现);或在代码中捕获重启信号,先优雅关闭所有套接字再退出:import signal import socket active_sockets = [] # 存储所有活跃套接字 def handle_shutdown(signum, frame): for sock in active_sockets: sock.close() exit(0) # 注册终止信号处理 signal.signal(signal.SIGINT, handle_shutdown) signal.signal(signal.SIGTERM, handle_shutdown)优化端口分配逻辑
不要硬编码端口范围,改为动态检测可用端口:从指定范围逐个尝试绑定,成功则分配给客户端;同时维护端口使用状态,客户端断开后回收对应端口,避免端口耗尽。修正绑定地址
绑定套接字时不要用127.0.0.1,必须绑定0.0.0.0,否则无法接收外部客户端连接(本地测试时127.0.0.1可用,但AWS服务器需开放公网访问)。
三、AWS额外配置检查
确保AWS安全组开放所有需要的端口:包括大厅服务器的60000端口,以及你分配给客户端连接的端口范围,否则客户端会出现连接超时或拒绝的问题。
内容的提问来源于stack exchange,提问作者Bozo United
相关产品推荐
相关产品推荐

