Python Socket报错OSError:[WinError 10057] 求代码修复方案
解决Socket截图传输的OSError: [WinError 10057]问题
错误原因分析
WinError 10057 本质是套接字未处于连接状态就执行了发送/接收操作,常见于:
- 服务端未正确接受客户端连接就开始接收数据
- 客户端连接异常断开后,服务端未重新建立连接就继续操作
- 传输逻辑未遵循“先建立连接,再传输数据”的顺序
修复后的完整代码
客户端代码(定时截图并发送)
import socket import pyautogui import time import struct from io import BytesIO def send_screenshot(): # 配置服务端地址 HOST = '127.0.0.1' PORT = 5000 while True: try: # 每次循环重新建立连接(避免连接断开后无法恢复) client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect((HOST, PORT)) # 截图并保存到内存缓冲区(无需本地保存) screenshot = pyautogui.screenshot() img_buffer = BytesIO() screenshot.save(img_buffer, format='PNG') img_data = img_buffer.getvalue() # 先发送数据长度(解决粘包问题) client_socket.sendall(struct.pack('!I', len(img_data))) # 发送截图数据 client_socket.sendall(img_data) print(f"已发送截图,大小:{len(img_data)}字节") client_socket.close() except Exception as e: print(f"发送出错:{str(e)}") # 间隔7秒 time.sleep(7) if __name__ == "__main__": send_screenshot()
服务端代码(接收并保存截图)
import socket import struct from datetime import datetime def receive_screenshot(): HOST = '0.0.0.0' PORT = 5000 # 创建套接字并监听 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((HOST, PORT)) server_socket.listen(5) print(f"服务端已启动,监听端口:{PORT}") while True: try: # 等待客户端连接 conn, addr = server_socket.accept() print(f"客户端 {addr} 已连接") # 先接收数据长度 len_data = conn.recv(4) if not len_data: conn.close() continue img_len = struct.unpack('!I', len_data)[0] # 接收完整截图数据 img_data = b'' while len(img_data) < img_len: chunk = conn.recv(min(img_len - len(img_data), 4096)) if not chunk: break img_data += chunk # 保存截图(带时间戳) if len(img_data) == img_len: timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"screenshot_{timestamp}.png" with open(filename, 'wb') as f: f.write(img_data) print(f"已保存截图:{filename}") else: print("截图数据接收不完整") conn.close() except Exception as e: print(f"接收出错:{str(e)}") if __name__ == "__main__": receive_screenshot()
关键修改说明
- 连接逻辑优化:客户端每次发送前重新建立连接,避免长期连接断开后无法恢复;服务端持续监听新连接,确保每次传输都基于有效连接
- 内存传输优化:客户端直接将截图保存到内存缓冲区,无需先写入本地文件,减少IO开销
- 粘包处理:通过先发送数据长度的方式,确保服务端能完整接收每一张截图
- 异常捕获:增加全局异常捕获,避免单个传输错误导致程序崩溃
内容的提问来源于stack exchange,提问作者axelrothing
相关产品推荐
相关产品推荐

