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.
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.
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()
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();
}
}
L'état du terminal exécuté ressemble à ceci
J'ai pu afficher correctement le graphique généré par Python
Non, c'est pratique !!
Je n'ai pas fait de note parce que je l'ai utilisé comme référence ...
Recommended Posts