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

为什么PowerShell无法正确读取TCP网络流发送的字符串内容?

问题原因

  • PowerShell侧API使用类型不匹配:StreamReader是字符读取类,其Read方法要求传入的缓冲区是char[]类型,你传入了byte[]类型的缓冲区,参数类型不匹配导致读取操作异常,返回值为0,这就是你看到的第一行输出0的来源。
  • 逻辑冗余冲突:StreamReader内部已经封装了字节转字符的逻辑,且自带预读缓冲区,你后续手动调用编码方法转换字节的逻辑完全多余,同时混用StreamReader和直接操作网络流的逻辑会导致数据读取异常,最终只能得到空输出。

修复方案

方案1:直接从网络流读取字节(推荐,和你现有逻辑对齐)

直接修改PowerShell侧代码,删除StreamReader相关逻辑,直接从NetworkStream读取字节即可:

$tcpConnection = New-Object System.Net.Sockets.TcpClient($args[0], $args[1])
$tcpStream = $tcpConnection.GetStream()
$buffer = New-Object System.Byte[] 1024
$encoding = New-Object System.Text.AsciiEncoding 

while ($tcpConnection.Connected)
{
    $readLength = $tcpStream.Read($buffer, 0, $buffer.Length)
    if ($readLength -gt 0) {
        $response = $encoding.GetString($buffer, 0, $readLength)  
        Write-Host $response
    }
    Start-Sleep -Milliseconds 10
}

$tcpStream.Close()
$tcpConnection.Close()

方案2:保留StreamReader用法

如果要使用StreamReader做字符读取,改成纯字符读取逻辑即可,不需要手动处理字节:

$tcpConnection = New-Object System.Net.Sockets.TcpClient($args[0], $args[1])
$tcpStream = $tcpConnection.GetStream()
# 初始化时指定ASCII编码,和服务端发送编码对齐
$reader = New-Object System.IO.StreamReader($tcpStream, [System.Text.Encoding]::ASCII)

while ($tcpConnection.Connected)
{
    $response = $reader.ReadToEnd()
    if (![string]::IsNullOrEmpty($response)) {
        Write-Host $response
    }
    Start-Sleep -Milliseconds 10
}

$reader.Close()
$tcpConnection.Close()

如果选择ReadLine方法逐行读取,需要同步修改C#服务端代码,发送字符串时末尾追加换行符,否则ReadLine会一直等待换行符不会返回:

client.Client.Send(Encoding.ASCII.GetBytes(cmd + Environment.NewLine));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:54:08