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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:50:34