物知らずPGの覚え書き

「理解したこと」や「こうやって使えた」などのプログラムの覚え書きとなります

名前付きパイプを用いてプロセス間通信を行う方法

はじめに

プログラム間でデータの受け渡し(プロセス間通信)を行うには、名前付きパイプで出来ることを知ったので今回は単純なプログラムで名前付きパイプの使い方を確認しました。

f:id:YoiTaka:20170728103451j:plain

プログラムの概要

作成したプログラムでは、Client側(C#)がデータを送信し、Server側(C#)がそのデータを受信する単方向パイプとなります。

また、今回はClientとSeverともにC#で記述しましたが最終的には他言語での双方向通信を行いたいと考えています。

ソースコード

Client側

  1. パイプを接続  
  2. Serverに送信する文字列を入力
class Client
{
    static void Main(string[] args)
    {
        Console.WriteLine("This is Client.");

        using (NamedPipeClientStream pipeClient = new NamedPipeClientStream("testpipe"))
        {
            //1. パイプを接続 
            pipeClient.Connect();
            Console.WriteLine("Connected to pipe.");

            
            using (StreamWriter sw = new StreamWriter(pipeClient))
            {
                sw.AutoFlush = true;

                //2. Serverに送信する文字列を入力
                Console.Write("Enter text \n>>");
                string message = Console.ReadLine();
                sw.WriteLine(message);

                Console.WriteLine("Send to Sever : Mesasage is '{0}' ", message);
            }
        }
        Console.ReadLine();
    }
}

Server側

  1. パイプの接続待ち  
  2. Clientからデータを受信
  3. 出力
using System.IO;
using System.IO.Pipes;

class Server
{
    static void Main(string[] args)
    {
        Console.WriteLine("This is Server");

        using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe"))
        {
            //1.パイプの接続待ち
            pipeServer.WaitForConnection();

            // 2. Clientからデータを受信
            using (StreamReader sr = new StreamReader(pipeServer))
            {
                string temp;
                while ((temp = sr.ReadLine()) != null)
                {
                    //3. 出力
                    Console.WriteLine("Received from server: {0}", temp);
                }
            }
       }
        Console.ReadLine();
    }
}

実行結果

実行する際の注意としては、パイプの接続を行う必要がありますのでClietn側とServer側の両方のプログラムを実行する必要があり、片方のみ実行だと永久に接続待ちとなってしまいます。  
VSでの複数プログラムの実行方法は前回の記事に書いています。

実行画面

f:id:YoiTaka:20170120143108p:plain

Client: 送信するテキスト(Hello,Server)を入力

f:id:YoiTaka:20170120143337p:plain

Client: Enterを入力

Clientからデータを受信できていることが確認できる。

f:id:YoiTaka:20170120143459p:plain

おわりに

今回は名前付きパイプを用いたプロセス間の単方向通信プログラムを作成しました。 次回は双方向通信を行えるプログラムを作成したいと思います。

/* パンくずリスト*/ /* カテゴリ階層化*/