You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:31:12