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)
额外补充说明
- 服务器代码里的
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)是正确的配置,它允许服务器在重启时快速重用端口,避免因TIME_WAIT状态导致的绑定失败,你可以保留这行。 - 以后遇到类似端口错误,先检查代码逻辑:服务器负责
bind+listen+accept,客户端负责connect,不要搞混两者的职责。
备注:内容来源于stack exchange,提问作者EPWebS25
相关产品推荐
相关产品推荐

