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.
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.
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();
}
}
Der Status des ausgeführten Terminals sieht folgendermaßen aus
Ich konnte das von Python erzeugte Diagramm richtig anzeigen
Nein, es ist praktisch !!
Ich habe keine Notiz gemacht, weil ich sie als Referenz verwendet habe ...
Recommended Posts