Python Tkinter+Socket服务端连客户端报WinError 10060超时错误求助
WinError 10060报错原因及代码修复方案
报错核心本质
WinError 10060属于连接超时错误,指客户端发出的TCP连接请求在指定时间内没有收到服务端的响应,最终触发超时。
代码中导致报错的直接问题
1. 重复调用root.mainloop(),服务端逻辑完全未执行
你把root.mainloop()写在了TCPServer类定义和实例化的前面,mainloop()是Tkinter的GUI阻塞循环,只要不关闭GUI窗口,后续的服务端初始化、启动监听、开线程的代码完全不会运行。等于只开了个GUI空窗口,服务端压根没启动,客户端自然连不上。
2. 服务端绑定的IP地址错误
你写的self.HOST = '192.0.0.1'大概率不是本地机器的有效IP:
- 仅在本机测试的话,建议绑定
127.0.0.1(本地回环地址,仅本机可访问) - 需要同局域网其他设备连接的话,建议绑定
0.0.0.0(监听本机所有网卡的IP地址)
3. 缺少socket模块导入
代码中使用了socket相关API,但没有写import socket,运行会直接抛出模块未找到错误,服务端无法启动。
其他可能触发10060的原因
- 防火墙拦截:Windows防火墙或第三方安全软件拦截了8080端口的TCP通信,可临时关闭防火墙测试
- 客户端连接地址不匹配:客户端填写的连接IP/端口和服务端实际监听的不一致
- 跨网段访问限制:客户端和服务端不在同一局域网,且没有做端口映射的情况下,公网请求无法到达内网服务端
修复后的可用代码
from tkinter import * import _thread import socket # 补导入socket模块 #页面代码 root = Tk() root.title('TCP服务端') root.geometry('640x480') label_1 = Label(root,relief=GROOVE,text='从客户端接收的数据') label_1.place(relx=0.1,rely=0.0,relwidth=0.4,relheight=0.1) Operate = Text(root,relief=GROOVE) Operate.place(relx=0.1,rely=0.1,relwidth=0.4,relheight=0.4) Tips = Text(root,relief=GROOVE) Tips.place(relx=0.1,rely=0.5,relwidth=0.4,relheight=0.4) Tips.insert(END,'当前状态:\n') Tips.configure(state=DISABLED) class TCPServer(): def __init__(self): self.HOST = '127.0.0.1' # 改成正确的绑定IP self.PORT = 8080 self.BUFSIZ = 1024 self.ADDRESS = (self.HOST,self.PORT) self.tcpServerSocket = socket.socket(AF_INET, SOCK_STREAM) self.tcpServerSocket.bind(self.ADDRESS) #IP地址和固定端口信息 self.tcpServerSocket.listen(5) def try_connect(self): global var var='服务器正在运行,等待客户端连接...\n' Tips.configure(state=NORMAL) Tips.insert(END,var) Tips.configure(state=DISABLED) while True: self.client_socket, self.client_address = self.tcpServerSocket.accept() var='客户端{}已连接!\n'.format(self.client_address) Tips.configure(state=NORMAL) Tips.insert(END,var) Tips.configure(state=DISABLED) while True: self.data = self.client_socket.recv(self.BUFSIZ) if(self.data): var='接收到消息 {}({} bytes) 来自 {}\n'.format(self.data.decode('utf-8'), len(self.data), self.client_address) # 返回响应数据,接受的数据不做处理即返回 self.client_socket.send(self.data) var='发送消息 {} 至 {}\n'.format(self.data.decode('utf-8'), self.client_address) Tips.configure(state=NORMAL) Tips.insert(END,var) Tips.configure(state=DISABLED) Operate.configure(state=NORMAL) Operate.insert(END,self.data) Operate.configure(state=DISABLED) else: var='客户端 {} 已断开!\n'.format(self.client_address) Tips.configure(state=NORMAL) Tips.insert(END,var) Tips.configure(state=DISABLED) break # 关闭socket self.client_socket.close() # 取消监听socket,自此拒绝响应其它客户端 self.tcpServerSocket.close() Server = TCPServer() _thread.start_new_thread(Server.try_connect, ()) # 补充线程空参数,避免运行报错 root.mainloop() # 把mainloop移到最后,先启动服务端再跑GUI循环
测试注意事项
客户端连接时填写的IP要和服务端绑定IP一致,本机测试填127.0.0.1,端口填8080即可正常连接。
内容的提问来源于stack exchange,提问作者光头大魔王
相关产品推荐
相关产品推荐

