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

Python Socket端口问题:随机端口绑定及客户端适配咨询

Python Socket端口问题解决:从报错到随机端口配置

先理清楚你遇到的两个错误

WinError 10048

这是端口被占用了,大概率是之前的服务器进程没彻底关掉,TCP协议为了保证数据传输完整,会把端口保留一段时间(TIME_WAIT状态),这时候再复用同一个端口就会触发报错。

WinError 10049

你改的90000端口超出了TCP端口的有效范围!TCP端口的合法区间是1-65535,超过这个数值系统无法识别,自然报错。


基础问题解决:端口占用与范围修复

  1. 使用合法端口:优先选择1024-65535之间的端口(1-1023是系统预留端口,尽量避免使用)。
  2. 强制释放占用端口:
    • 打开命令提示符,输入 netstat -ano | findstr :9999,找到最后一列的进程ID(PID)。
    • 执行 taskkill /F /PID <刚才查到的PID>,强制终止占用端口的进程。
  3. 开启端口快速复用:在server代码中添加一行配置,避免TIME_WAIT状态导致的端口锁定:
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 添加此行
    server.bind((HOST, PORT))
    

进阶方案:用系统自动分配空闲端口

你看到的 sock.bind(('', 0)) 不需要修改IP,只需将端口设为0,系统就会自动分配空闲端口。但要让客户端正常连接,必须让客户端获取到这个随机分配的端口,具体修改如下:

修改后的server.py

import socket

HOST = '127.0.0.1'
PORT = 0  # 设为0让系统自动分配空闲端口

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((HOST, PORT))
# 获取系统实际分配的端口号
real_port = server.getsockname()[1]
print(f"服务器已启动,监听地址:{HOST}:{real_port}")

server.listen(5)

while True:
    communication_socket, address = server.accept()
    print(f"连接来自:{address}")
    message = communication_socket.recv(1024).decode('utf-8')
    print(f"客户端消息:{message}")
    communication_socket.send("感谢你的消息!".encode('utf-8'))
    communication_socket.close()
    print(f"与{address}的连接已关闭")

客户端连接方式(两种可选)

方式1:手动输入端口(适合测试场景)

import socket

HOST = '127.0.0.1'
# 启动server后会打印端口号,将该数值输入即可
PORT = int(input("请输入服务器端口号:"))

def client_connect(message):
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((HOST, PORT))
    client.send(message.encode('utf-8'))
    print(client.recv(1024).decode('utf-8'))

方式2:自动读取端口(适合自动化运行)

让server将端口号写入临时文件,客户端读取该文件获取端口:

  • 在server.py的print(f"服务器已启动...")之后添加写文件代码:
    with open('server_port.txt', 'w') as f:
        f.write(str(real_port))
    
  • 修改后的client.py:
    import socket
    
    HOST = '127.0.0.1'
    # 读取server写入的端口文件
    with open('server_port.txt', 'r') as f:
        PORT = int(f.read().strip())
    
    def client_connect(message):
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.connect((HOST, PORT))
        client.send(message.encode('utf-8'))
        print(client.recv(1024).decode('utf-8'))
    

注意事项

  • 使用随机端口时,必须先启动server,待其输出端口号后再启动客户端,否则会因端口未知导致连接失败。
  • 采用文件共享端口的方式时,建议添加异常处理(如文件不存在的情况),避免客户端启动报错。

内容的提问来源于stack exchange,提问作者Sticonike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:25:39