Pythonで取得した文字列をJavaで作成したアプリに送る方法（あるいは一般的にアプリ間でデータを送受信する方法）


現在個人的に使用する言語をJavaからPythonに置き換えてるのですが、Javaで書いた大きなプログラムもあるため一部をPythonで書き、そこで取得した文字列を昔書いたJavaのプログラムに送り処理したいと考えています。

**追記：ローカルで動かしているプログラム間です**

Pythonで取得した文字列を逐次的にJavaプログラムに送る方法、あるいはもっと一般的にアプリ間でデータを送受信する方法は無いでしょうか？  
文字列をファイルに書き込みそれを読み取るという方法も考えましたが、ラグが生じ、またHDD/SSDへの頻繁な読み書きが必要なため直接データの送受信したいと思います。

具体的にやりたい事は以下の通りなのでこれが解決できる手段が他にあればそれでも構いません：

  1. [MisskeyボットをPythonで作る - Qiita](https://qiita.com/CyberRex/items/e49828dba8e5867d8b26)に書かれてる方法でMisskeyのグローバルタイムラインを取得する
  2. 取得したノートをJavaで書いたコードで処理する

以上、よろしくお願いします。




開発言語やOSの異なるプログラム間での通信を行う場合、TCP/IP(socket)を使うのがよいと思います。

**処理の流れ**

  1. あらかじめJava側のTCP/IP(socket)サーバを立ち上げておく
  2. Python側からJava側へ、なんらかの処理依頼を送信する
  3. Java側で依頼されたなんらかの処理を実行し、処理結果をPython側へ送信する
  4. Python側で処理結果を受信する

**Java側のコード例**

[code]

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.InetSocketAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * ソケット通信(サーバー側)
     */
    class SocketServer {
    
        public static void main(String[] args) {
    
            ServerSocket sSocket = null;
            Socket socket = null;
            BufferedReader reader = null;
            PrintWriter writer = null;
            final String SERVER_IP = "127.0.0.1";
            final int SERVER_PORT = 10000;
            try {
                sSocket = new ServerSocket();
                sSocket.bind(new InetSocketAddress(SERVER_IP, SERVER_PORT));
                System.out.println("クライアントからの接続待ち");
                socket = sSocket.accept();
                System.out.println("クライアントからの接続完了");
                //クライアントからのデータ受信用
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //クライアントへの応答送信用
                writer = new PrintWriter(socket.getOutputStream(), true);
    
                String line = null;
                System.out.println("クライアントからの入力データ待ち");
                while ((line = reader.readLine()) != null) {
                    System.out.println("クライアントからの入力データ:" + line);
    
                    //クライアントからの入力データに応じたJava側の処理
                    System.out.println("クライアントからの入力データに応じたJava側の処理を実行");
                    //処理結果をサーバへ送信
                    writer.println("Java側の処理結果" + line.charAt(0));
                    System.out.println("Java側の処理結果をクライアントへ送信");
                }
    
                try {
                    reader.close();
                    writer.close();
                    socket.close();
                    sSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
[/code]

**Python側のコード例**

[code]

    # coding: utf-8
    # ソケット通信(クライアント)
    import socket
    
    if __name__ == '__main__':
        SERVER_IP = '127.0.0.1'
        SERVER_PORT = 10000
        server = (SERVER_IP, SERVER_PORT)
    
        socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        socket.connect(server)
    
        count = 0
        while True:
            line = str(count) + ': Python側からJava側への送信データ\n'
            # サーバに送信
            socket.send(line.encode("UTF-8"))
            print('サーバーへ処理依頼: '+str(count))
    
            # サーバからの処理結果受信
            result = socket.recv(4096).decode()
            print('サーバーからの処理結果: ' + str(result))
    
            count = count+1
            time.sleep(200)
    
    
        socket.close()
    
[/code]

**実行結果(Java側)**

[code]

    クライアントからの接続待ち
    クライアントからの接続完了
    クライアントからの入力データ待ち
    クライアントからの入力データ:0: Python側からJava側への送信データ
    クライアントからの入力データに応じたJava側の処理を実行
    Java側の処理結果をクライアントへ送信
    クライアントからの入力データ:1: Python側からJava側への送信データ
    クライアントからの入力データに応じたJava側の処理を実行
    Java側の処理結果をクライアントへ送信
    
[/code]

**実行結果(Python側)**

[code]

    サーバーへ処理依頼: 0
    サーバーからの処理結果: Java側の処理結果0
    
    サーバーへ処理依頼: 1
    サーバーからの処理結果: Java側の処理結果1
    
[/code]

**（質問者による）注意**  
コード例はPython側から永遠にデータを送ってますが、必要があればPython側とJava側で終了の依頼を取り決めをして、処理を繰り返してください。

**動作確認に使用したバージョン**  
Python 3.10.5  
openjdk 18 2022-03-22




開発言語やOSの異なるプログラム間での通信を行う場合、TCP/IP(socket)を使うのがよいと思います。

**処理の流れ**

  1. あらかじめJava側のTCP/IP(socket)サーバを立ち上げておく
  2. Python側からJava側へ、なんらかの処理依頼を送信する
  3. Java側で依頼されたなんらかの処理を実行し、処理結果をPython側へ送信する
  4. Python側で処理結果を受信する

**Java側のコード例**

[code]

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.InetSocketAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * ソケット通信(サーバー側)
     */
    class SocketServer {
    
        public static void main(String[] args) {
    
            ServerSocket sSocket = null;
            Socket socket = null;
            BufferedReader reader = null;
            PrintWriter writer = null;
            final String SERVER_IP = "127.0.0.1";
            final int SERVER_PORT = 10000;
            try {
                sSocket = new ServerSocket();
                sSocket.bind(new InetSocketAddress(SERVER_IP, SERVER_PORT));
                System.out.println("クライアントからの接続待ち");
                socket = sSocket.accept();
                System.out.println("クライアントからの接続完了");
                //クライアントからのデータ受信用
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //クライアントへの応答送信用
                writer = new PrintWriter(socket.getOutputStream(), true);
    
                String line = null;
                System.out.println("クライアントからの入力データ待ち");
                while ((line = reader.readLine()) != null) {
                    System.out.println("クライアントからの入力データ:" + line);
    
                    //クライアントからの入力データに応じたJava側の処理
                    System.out.println("クライアントからの入力データに応じたJava側の処理を実行");
                    //処理結果をサーバへ送信
                    writer.println("Java側の処理結果" + line.charAt(0));
                    System.out.println("Java側の処理結果をクライアントへ送信");
                }
    
                try {
                    reader.close();
                    writer.close();
                    socket.close();
                    sSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
[/code]

**Python側のコード例**

[code]

    # coding: utf-8
    # ソケット通信(クライアント)
    import socket
    
    if __name__ == '__main__':
        SERVER_IP = '127.0.0.1'
        SERVER_PORT = 10000
        server = (SERVER_IP, SERVER_PORT)
    
        socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        socket.connect(server)
    
        count = 0
        while True:
            line = str(count) + ': Python側からJava側への送信データ\n'
            # サーバに送信
            socket.send(line.encode("UTF-8"))
            print('サーバーへ処理依頼: '+str(count))
    
            # サーバからの処理結果受信
            result = socket.recv(4096).decode()
            print('サーバーからの処理結果: ' + str(result))
    
            count = count+1
            time.sleep(200)
    
    
        socket.close()
    
[/code]

**実行結果(Java側)**

[code]

    クライアントからの接続待ち
    クライアントからの接続完了
    クライアントからの入力データ待ち
    クライアントからの入力データ:0: Python側からJava側への送信データ
    クライアントからの入力データに応じたJava側の処理を実行
    Java側の処理結果をクライアントへ送信
    クライアントからの入力データ:1: Python側からJava側への送信データ
    クライアントからの入力データに応じたJava側の処理を実行
    Java側の処理結果をクライアントへ送信
    
[/code]

**実行結果(Python側)**

[code]

    サーバーへ処理依頼: 0
    サーバーからの処理結果: Java側の処理結果0
    
    サーバーへ処理依頼: 1
    サーバーからの処理結果: Java側の処理結果1
    
[/code]

**（質問者による）注意**  
コード例はPython側から永遠にデータを送ってますが、必要があればPython側とJava側で終了の依頼を取り決めをして、処理を繰り返してください。

**動作確認に使用したバージョン**  
Python 3.10.5  
openjdk 18 2022-03-22

