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

Windows环境下Python Socket编程遇WinError 10048端口占用错误求助

Windows环境下Python Socket编程遇WinError 10048端口占用错误求助

嗨,我仔细看了你的问题和代码,发现你反复清理端口其实是做无用功——错误的根源是客户端代码的逻辑问题,而不是端口被残留进程占用!

问题出在哪?

你的服务器代码是对的:它绑定端口2133、监听连接。但你的客户端代码里居然也写了s.bind((socket.gethostname(),2133))——这是服务器才需要做的操作!

客户端的核心逻辑是主动连接服务器,而不是绑定到和服务器相同的端口。当你运行客户端时,它会尝试抢占2133端口,但这个端口已经被服务器占用了(或者反过来,先开客户端的话服务器会报错),直接触发了WinError 10048“同一端口只能被一个程序使用”的限制。

修正后的客户端代码

把客户端里的s.bind(...)那一行完全替换成s.connect(...),其他逻辑保留即可:

import socket
import pickle

a=10
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 删掉原来的bind行,换成connect连接服务器的地址
s.connect((socket.gethostname(),2133))  # 连接到服务器的端口

while True:
    complete_info = b''  #message being received is in bytes so specify b with an empty string
    rec_msg = True
    while True:
        mymsg = s.recv(16)
        if rec_msg:
            print(f"The length of message = {mymsg[:a]}")
            x = int(mymsg[:a])
            rec_msg = False
        complete_info += mymsg
        if len(complete_info)-a == x:
            print("received the complete info")
            print(complete_info[a:])
            m=pickle.loads(complete_info[a:])
            print(m)
            rec_msg = True
            complete_info=b''
        print(complete_info)

额外补充说明

  1. 服务器代码里的s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)是正确的配置,它允许服务器在重启时快速重用端口,避免因TIME_WAIT状态导致的绑定失败,你可以保留这行。
  2. 以后遇到类似端口错误,先检查代码逻辑:服务器负责bind+listen+accept,客户端负责connect,不要搞混两者的职责。

备注:内容来源于stack exchange,提问作者EPWebS25

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:40:29