首页 > 解决方案 > Powershell 中的实时 TCP 接收器

问题描述

我一直在尝试在 Powershell 中创建一个发送和接收数据的 TCP 客户端,但我不知道如何让我的脚本实时显示服务器输出。我尝试使用 Start-Job 和 Receive-Job 来执行此操作,但要让作业显示其输出,您必须每次都调用 Receive-Job。我的目标是让 PS 终端可用于读取 Read-Host 的输入,同时等待来自服务器的数据并显示它。我的代码是:

$server = "127.0.0.1"
$port = 2137

$connection = New-Object System.Net.Sockets.TcpClient($server, $port)
$stream = New-Object System.Net.Security.SslStream $connection.GetStream(),$false,({$true} -as [System.Net.Security.RemoteCertificateValidationCallback])
$stream.AuthenticateAsClient("Foo")

$reader = New-Object System.IO.BinaryReader($stream)
$writer = New-Object System.IO.StreamWriter($stream)

$writer.WriteLine("aadmin")
$writer.Flush()

$writer = New-Object System.IO.BinaryWriter($stream)

$read = $reader.ReadInt32()
if($read -eq 0)
{
    $writer.Write(0)
    Write-Host "Password: " -NoNewline
    $password = Read-Host
    $writer.Write($password)
    
    $read = $reader.ReadInt32()
    if($read -eq 0)
    {
        $receiver = Start-Job {
            while($true)
            {
                if($connection.Available -ge 1)
                {
                    $read = $reader.ReadString()
                    Write-Host $read
                }
            }
        }

        do
        {
            Write-Host "[admin@server] > " -NoNewline
            $in = Read-Host
            $writer.Write($in)

            Receive-Job $receiver

        } while($in -ne "exit" -and $connection.Connected)
    }
    else { Write-Host "Error: ?" }

    Stop-Job $receiver
    Remove-Job $receiver -Force

    $reader.Close()
    $writer.Close()
    $stream.Close()
    $connection.Close()
}
else { Write-Host "Error" }

标签: powershelltcp

解决方案


推荐阅读