MessagePack-Try pour lier Java et Python avec RPC

Préface

Expérimenté avec la nécessité d'intégrer des systèmes réalisés avec Java et Python, et de faciliter l'utilisation des systèmes implémentés avec Java avec des scripts Python. Au début, je me demandais si je déciderais moi-même du protocole, mais MessagePack-RPC semblait très pratique, alors j'ai décidé de l'accepter.

Ce que j'ai essayé

Le fait est que je veux appeler la méthode côté Java à partir de Python et la méthode côté Python à partir de Java. Bien sûr, il doit être capable de gérer des arguments et de renvoyer des valeurs. Alors, cette fois,

--Si vous passez une chaîne de caractères, vous obtiendrez un caractère avec Hello retourné (bonjour)

Je vais essayer. Le côté serveur est Python et le côté client est Java.

code

Code côté Python

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()

Code côté Java

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();
    }
}

Résultat d'exécution

L'état du terminal exécuté ressemble à ceci result_console.PNG

J'ai pu afficher correctement le graphique généré par Python result_graph.PNG

alors

Non, c'est pratique !!

référence

Je n'ai pas fait de note parce que je l'ai utilisé comme référence ...

Recommended Posts

MessagePack-Try pour lier Java et Python avec RPC
Lien pour commencer avec python
Fractal pour faire et jouer avec Python
Grattage de la nourriture avec python et sortie en CSV
Stratégie sur la façon de monétiser avec Python Java
Procédure pour charger MNIST avec python et sortie en png
Je veux gérer l'optimisation avec python et cplex
Benchmarks langage C, Java, Python avec factorisation prime
Essayez le fonctionnement de la base de données avec Python et visualisez avec d3
Étudiez l'échange de données Java et Python avec Apache Arrow
Programmation avec Python et Tkinter
Connectez-vous à BigQuery avec Python
Chiffrement et déchiffrement avec Python
Python et matériel - Utilisation de RS232C avec Python -
Connectez-vous à Wikipedia avec Python
Publiez sur Slack avec Python 3
J'ai comparé Java et Python!
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
python avec pyenv et venv
Fonctionne avec Python et R
API Nifty Cloud facile à utiliser avec botocore et python
écran et écran partagé avec connexion python et ssh au serveur distant
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
Résolution avec Ruby, Perl, Java et Python AtCoder ATC 002 A
Essayez de lier iTunes et Hue of Collection Case avec MQTT
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
[Jouons avec Python] Traitement d'image en monochrome et points
Résolution avec Ruby, Perl, Java et Python AtCoder ATC 002 B
J'ai essayé d'énumérer les différences entre java et python
Convertir une vidéo en noir et blanc avec ffmpeg + python + opencv
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
Obtenez des données supplémentaires vers LDAP avec python (Writer et Reader)
Comment se connecter à AtCoder avec Python et soumettre automatiquement
Comment analyser le code source Java avec AST (Abstract Syntax Tree) en utilisant ANTLR et Python
Communiquez avec FX-5204PS avec Python et PyUSB
Briller la vie avec Python et OpenCV
solveur> Lien> Résoudre le solveur Excel avec python
Différence entre java et python (mémo)
Python: comment utiliser async avec
Robot fonctionnant avec Arduino et python
Python 3.6 sous Windows ... et vers Xamarin.
Installez Python 2.7.9 et Python 3.4.x avec pip.
Comparaison de la grammaire de base entre Java et Python
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
[Introduction à Python3 Jour 1] Programmation et Python
Scraping avec Node, Ruby et Python
[Python] Ecrire dans un fichier csv avec Python
Ravi de vous rencontrer avec python
Grattage avec Python, Selenium et Chromedriver
Essayez d'exploiter Facebook avec Python
Sortie vers un fichier csv avec Python
Grattage avec Python et belle soupe
Convertir la liste en DataFrame avec python