バナー画像

プロセス間通信とは、Java や Java 以外で作成されたプログラム間で、メッセージのやりとりを行う通信手段のことです。

この記事では、Java でプロセス間通信を行う方法を解説します。

ポテパンダの一言メモ

そもそもプロセスとは、プログラムの実行単位を指し、例えばメモ帳や、ブラウザなどのアプリケーションを起動すると、メモリ領域などの割り当てを受けたプロセスが作成され、起動したアプリケーションはそのプロセス上で実行されます。

Javaでプロセス間通信を行う方法

Java でプロセス間通信を行う方法には、いくつかの方法があります。

  • ソケットを使用を使用する
  • 入出力ストリームを使用する
  • 名前付きパイプを使用する

1つ目のソケット通信は、IPアドレスとポート番号の組み合わせで、相手と通信をする方法です。ソケット通信は、TCP(Transmission Control Protocol)または、UDP(User Diagram Protocol)のいずれかを利用して通信をするため、プロセス間通信の目的以外にも、ネットワークを通じて外部の端末と通信することも可能です。

Java でソケット通信を実装する方法については、以下の記事で詳しく解説していますので、こちらをご覧ください。

【関連記事】
Javaソケット通信入門。TCPでデータの送受信をする

2つ目の入出力ストリームを使用する方法は、親プログラムが、子プロセスの入出力ストリームへのハンドルを取得し、子プロセスのストリームに対して書き込みや読み取りを行います。分かりやすく言えば、子プロセスで System.out.println(“メッセージ”); のようしてコンソールに出力したメッセージを、親プロセスが読み取って処理を行うイメージです。

3つ目の名前付きパイプとは、識別名を付けたパイプを作成する機能で、FIFO(先入れ先出し)方式で他のプログラムへデータを渡すことができる特殊なファイルです。1つの名前付きパイプに対して複数のプログラムがアクセスでき、双方向にデータのやりとりができる仕組みとなっています。

入出力ストリームを使用したプロセス間通信

入出力ストリームを使ってプロセス間通信をする方法を見てみましょう。

次のサンプルコードは、子プロセスとして動作するプログラムが標準出力ストリームに書き込んだ内容を、親プロセスとして動作するプログラムが読み取り、結果をコンソールに出力するプログラムです。

まずは、子プロセスのコードを作成します。

以下のコードは、1秒おきに計10秒、標準出力ストリームにデータを書き込むプログラムです。

public class Child {
  public static void main(String[] args) {
    for(int i = 1; i <= 10; i++) {
      try {
        Thread.sleep(1000);
        System.out.println(i + "秒経過しました。");
      } catch (InterruptedException e) {}
    }
  }
}

次に、親プロセスのコードを作成します。

プロセス間通信を試すため、上で作成した子プロセスのコードを、親プロセスから Java コマンド使って、別プロセスとして起動します。

また、子プロセスの標準出力ストリームのハンドルを getInputStream() で受け取り、子プロセスがストリームに書き込みした内容を、親プロセスのコンソールに出力します。

public class Parent {
  public static void main(String[] args) {

    Process childProcess = null;
    try {
      // 子プロセスを起動
      childProcess = Runtime.getRuntime().exec("java Child.java");

      // 子プロセスの標準出力ストリームのハンドルを取得
      var inStream = new BufferedReader(
          new InputStreamReader(childProcess.getInputStream()));

      // 子プロセスが標準出力へ書き込みを行ったら、コンソールに内容を出力
      while (true) {
        String line = inStream.readLine();
        if (line == null) {
          break;
        }
        System.out.println(line);
      }
    } catch (IOException e) {
      e.printStackTrace();
      return;
    }
  }
}

コードの実行結果は、次のとおりです。

子プロセス側で出力された内容が、親プロセスで読み取られていることが分かります。

$ java Parent.java

1秒経過しました。
2秒経過しました。
3秒経過しました。
4秒経過しました。
5秒経過しました。
6秒経過しました。
7秒経過しました。
8秒経過しました。
9秒経過しました。
10秒経過しました。

名前付きパイプを使用したプロセス間通信

名前付きパイプは、簡単に言えば、FIFO(先入れ先出し)でファイルの読み書きが出来るファイルです。1つの名前付きパイプに対し、複数のプログラムがアクセスし、片方でファイルに書き込みを行うと、もう一方で読み込むことができます。

では、名前付きパイプを作成して、Java プログラムから読み込むサンプルコードを作っていきましょう。

名前付きパイプの準備

名前付きパイプは、Linux や macOS の場合 mkfifo コマンドで作成します。Windows の場合は、専用の API を用いて作成します。

$ mkfifo named_pipe

名前付きパイプが作成されたか、確認してみましょう。

$ ls -lt
prw-r--r--  1 sato  staff  0  1 13 08:42 named_pipe

Java 側のプログラムで読み込むメッセージを、名前付きパイプに書き込みます。以下のコマンドを入力すると、別のプロセ

スが書き込んだ内容を読み込むまでコンソールがブロックされます。

$ echo "Test Message" > named_pipe

読み込み側の Javaコード作成

名前付きパイプからデータを読み込む Java 側のコードを書いていきます。

基本的には、通常のファイル読み込みと同様のコードで、名前付きパイプから FIFO (先出し先入)方式でデータを読み込むことができます。

// 名前付きパイプを読み取りで開く
File file = new File("/path/to/named_pipe");
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

// 書き込まれたメッセージを読み込む
String line = null;
while((line = br.readLine()) != null){
  System.out.println(line);
}

実行結果

Test Message

最後に

Java でプロセス間通信をする方法について、入出力ストリームを使用する方法と、名前付きパイプを使用する2つの方法を解説してきました。

複数のシステムや、IoT デバイスなどの機器と連携を行う時に、プロセス間通信はよく用いられるため、是非覚えておきましょう。

【関連記事】
Javaでのテキストファイル読み込み方法を理解しよう【頻出処理】

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。