为什么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
相关产品推荐
相关产品推荐

