PowerShell版 同期サーバー ソケットの例

Tech

参考URL

.NET Framework ネットワーク プログラミングのソース(C#版)を参考にPowerShellに落とし込んだもの。

ベースの仕様

基本は、マイクロソフトの記載のとおり。以下抜粋

このアプリケーションは、クライアントからの接続要求を受け取るサーバーの動きをする。

 このサーバーは同期ソケットで構築されるため、サーバー アプリケーションの実行は、クライアントからの接続を待っている間、一時停止となる。

 このアプリケーションはクライアントから文字列を受信し、それをコンソールに表示し、クライアントにエコー バックする。 クライアントからの文字列には、メッセージの終わりを伝えるための文字列 “<EOF>” が含まれている必要がある。

そのほか、オリジナル要素として、ちょっとコメント出力を追加している。

[byte[]]$bytes = New-Object byte[] 1024

[int]$port = 11000
[array]$HostEntries = [net.Dns]::Resolve([Net.Dns]::GetHostName())
$IPAddress  = $HostEntries.AddressList[1]
$localEndPoint = New-Object System.Net.IPEndpoint($IPAddress, $port)

$SocketType = [System.Net.Sockets.SocketType]::Stream
$ProcotocolType = [System.Net.Sockets.ProtocolType]::Tcp

#socket
$Listener = New-Object System.Net.Sockets.Socket($IPAddress.AddressFamily,
                $SocketType,$ProcotocolType)
try
{
    Write-Host 'IP is ' $IPAddress
    Write-Host 'Port is ' $port
    
    $Listener.Bind($localEndPoint)
    $Listener.Listen(10)

    while($true)
    {
        Write-Host 'Waiting for a connection...'
        $handler = $listener.Accept()
        [String]$data = $null

        #An incoming connection needs to be processed.  
        while ($true) {  
            $bytesRec = $handler.Receive($bytes);
            $data += [System.Text.Encoding]::ASCII.GetString($bytes, 0, $bytesRec)
            write-host  "data received : {0}", $data  
            if ($data.IndexOf("<EOF>") -gt -1 ) {  
                write-host  "break"   
                break
            }  
        }
        write-host  "Text received end : {0}", $data  

        #Echo the data back to the client.  
        [byte[]]$msg = [System.Text.Encoding]::ASCII.GetBytes($Data)
        $handler.Send($msg);  
        $handler.Shutdown([System.Net.Sockets.SocketShutdown]::Both);  
        $handler.Close();  
    }
}
catch
{
    Write-output 'err:' $error.ToString()
}
Finally
{
    write-host '\nPress ENTER to continue...' 
    Read-Host
}

仕様は、この通り

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました