MessagePack-Versuchen Sie, Java und Python mit RPC zu verbinden

Vorwort

Experimentiert mit der Notwendigkeit, ein mit Java und Python erstelltes System zu integrieren und die Bedienung eines mit Java implementierten Systems mit einem Python-Skript zu vereinfachen. Zuerst habe ich mich gefragt, ob ich das Protokoll selbst festlegen würde, aber MessagePack-RPC schien sehr praktisch zu sein, also habe ich mich dafür entschieden.

Was ich versucht habe

Der Punkt ist, dass ich die Java-Seitenmethode von Python und die Python-Seitenmethode von Java aufrufen möchte. Natürlich muss es in der Lage sein, Argumente zu verarbeiten und Werte zurückzugeben. Also diesmal

Ich werde es versuchen. Die Serverseite ist Python und die Clientseite ist Java.

Code

Code auf der Python-Seite

server.py


import msgpackrpc
import matplotlib.pyplot as plt
from PIL import Image

class TestServer(object):

    def hello(self, mesg):
        print(mesg)
        return ("Hello, " + mesg.decode()).encode()

    def add(self, a, b):
        return a + b

    def sum(self, d):
        return sum(d)

    def make_graph(self, d):
        plt.plot(d)
        plt.savefig('hoge.png')
        f = open('hoge.png', 'rb')
        d = f.read()
        f.close()
        return d

server = msgpackrpc.Server(TestServer())
server.listen(msgpackrpc.Address("localhost", 1985))
server.start()

Java-Seitencode

TestClient.java


import org.msgpack.rpc.Client;
import org.msgpack.rpc.loop.EventLoop;
import org.msgpack.type.Value;

import java.io.*;
import java.util.*;
import java.awt.image.*;
import javax.swing.*;
import javax.imageio.*;

public class TestClient {

    public static void main(String[] args) throws Exception {

        EventLoop loop = EventLoop.defaultEventLoop();
        Client client = new Client("localhost", 1985, loop);
                int v;

        System.out.println(" --- hello ---");
        Value result = client.callApply("hello", new Object[]{"miyo"});
        System.out.println("Result type:" + result.getType());
        String s = new String(result.asRawValue().getByteArray());
        System.out.println(s); // Hello, miyo
        System.out.println();

        System.out.println(" --- add --- ");
        result = client.callApply("add", new Object[]{100, 10}); // 110
        System.out.println("Result type:" + result.getType());
        v = result.asIntegerValue().getInt();
        System.out.println("result = " + v + " :" + (v == 110));
        System.out.println();

        System.out.println(" --- sum --- ");
        result = client.callApply("sum", new Object[]{new int[]{1, 2, 3, 4, 5}}); // 15
        System.out.println("Result type:" + result.getType());
        v = result.asIntegerValue().getInt();
        System.out.println("result = " + v + " :" + (v == 15));
        System.out.println();

        System.out.println(" --- make graph ---");
        result = client.callApply("make_graph",
                                  new Object[]{new int[]{1,2,4,8,10,3,6,8,9,-1}});
        System.out.println("Result type: " + result.getType());
        byte[] raw = result.asRawValue().getByteArray();
        BufferedImage img = ImageIO.read(new ByteArrayInputStream(raw));
        System.out.println(img);
        Icon icon = new ImageIcon(img);
        JOptionPane.showMessageDialog(null,
                                      "",
                                      "image",
                                      JOptionPane.PLAIN_MESSAGE,
                                      icon);
        client.close();
        loop.shutdown();
    }
}

Ausführungsergebnis

Der Status des ausgeführten Terminals sieht folgendermaßen aus result_console.PNG

Ich konnte das von Python erzeugte Diagramm richtig anzeigen result_graph.PNG

damit

Nein, es ist praktisch !!

Referenz

Ich habe keine Notiz gemacht, weil ich sie als Referenz verwendet habe ...

Recommended Posts

MessagePack-Versuchen Sie, Java und Python mit RPC zu verbinden
Link, um mit Python zu beginnen
Fraktal zum Erstellen und Spielen mit Python
Kratzen Sie das Essen mit Python und geben Sie es an CSV aus
Strategie zur Monetarisierung mit Python Java
Prozedur zum Laden von MNIST mit Python und zur Ausgabe an png
Ich möchte die Optimierung mit Python und CPlex behandeln
C-Sprache, Java, Python-Benchmarks mit Primfaktorisierung
Probieren Sie die DB-Operation mit Python aus und visualisieren Sie sie mit d3
Untersuchen Sie den Java- und Python-Datenaustausch mit Apache Arrow
Programmieren mit Python und Tkinter
Stellen Sie mit Python eine Verbindung zu BigQuery her
Ver- und Entschlüsselung mit Python
Python und Hardware-Verwenden von RS232C mit Python-
Stellen Sie mit Python eine Verbindung zu Wikipedia her
Post to Slack mit Python 3
Ich habe Java und Python verglichen!
Schalten Sie Python mit Alternativen auf 2.7 um
Schreiben Sie mit Python in csv
Python mit Pyenv und Venv
Funktioniert mit Python und R.
Einfache Verwendung der Nifty Cloud API mit Botocore und Python
Bildschirm und geteilter Bildschirm mit Python- und SSH-Anmeldung am Remote-Server
[Python] Wie man mit Klassenvariablen mit Dekorator und Metaklasse spielt
Lösen mit Ruby, Perl, Java und Python AtCoder ATC 002 A.
Versuchen Sie, iTunes und Hue of Collection Case mit MQTT zu verknüpfen
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
[Lass uns mit Python spielen] Bildverarbeitung zu Monochrom und Punkten
Lösen mit Ruby, Perl, Java und Python AtCoder ATC 002 B.
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Konvertieren Sie Videos mit ffmpeg + python + opencv in Schwarzweiß
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Holen Sie sich zusätzliche Daten zu LDAP mit Python (Writer und Reader)
So melden Sie sich mit Python bei AtCoder an und senden automatisch
Analysieren von Java-Quellcode mit AST (Abstract Syntax Tree) mithilfe von ANTLR und Python
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Leuchtendes Leben mit Python und OpenCV
Solver> Link> Lösen Sie Excel Solver mit Python
Unterschied zwischen Java und Python (Memo)
Python: So verwenden Sie Async mit
Roboter läuft mit Arduino und Python
Python 3.6 unter Windows ... und zu Xamarin.
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Vergleich der grundlegenden Grammatik zwischen Java und Python
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
[Einführung in Python3 Tag 1] Programmierung und Python
Scraping mit Node, Ruby und Python
[Python] Mit Python in eine CSV-Datei schreiben
Schön dich mit Python zu treffen
Scraping mit Python, Selen und Chromedriver
Versuchen Sie, Facebook mit Python zu betreiben
Ausgabe in eine CSV-Datei mit Python
Kratzen mit Python und schöner Suppe
Konvertieren Sie die Liste mit Python in DataFrame