MessagePack-RPC を試してみる
MessagePack-RPC の Java を試してみようと格闘している。
サーバ側のコード。
package jp.heavenshell; import org.msgpack.rpc.Server; import org.msgpack.rpc.loop.EventLoop; public class ServerApp { public String echo(String msg) { return "hello " + msg; } public int add(int x, int y) { return x + y; } public int sub(int x, int y) { return x - y; } public int multi(int x, int y) { return x * y; } public int div(int x, int y) { if (y == 0) { return 0; } return x / y; } public static void main(String[] args) throws Exception { EventLoop loop = EventLoop.defaultEventLoop(); Server svr = new Server(); svr.serve(new ServerApp()); svr.listen(1985); loop.join(); } }
クライアント側。
package jp.heavenshell; import org.msgpack.MessagePackObject; import org.msgpack.rpc.Client; import org.msgpack.rpc.loop.EventLoop; public class ClientApp { public static void main(String[] args) throws Exception { Client cli = new Client("localhost", 1985, loop); MessagePackObject result = cli.callApply("echo", new Object[]{"world"}); System.out.println(result.asString()); // hello world result = cli.callApply("add", new Object[]{1, 2}); // 3 svr.close(); loop.shutdown(); } }
ついでに他言語からも出来ないかと思って試した。
クライアントが Python。PyPi にはアップロードされていないので、Github から clone して setup.py を実行
$ git clone https://github.com/msgpack/msgpack-rpc.git $ cd msgpack-rpc/python $ python setup.py test $ python setup.py install
#!/usr/bin/env python # -*- coding: utf-8 -*- from msgpackrpc.client import Client from msgpackrpc.transport import tcp client = Client(tcp.TCPTransport, ('localhost', 1985), {}) ret = client.send_request('echo', ['world']) print ret.result() ret = client.send_request('add', [10, 5]) print ret.result() ret = client.send_request('sub', [10, 5]) print ret.result() ret = client.send_request('multi', [10, 5]) print ret.result() ret = client.send_request('div', [10, 5]) print ret.result() ret = client.send_request('div', [10, 0]) print ret.result();
hello world 15 5 50 2 0
Perl の AnyEvent::MPRPC をクライアント。
#!/usr/bin/env perl use strict; use warnings; use Data::Dumper; use AnyEvent::MPRPC; my $d = $client->call('echo', ['foo bar']); my $res = $d->recv; warn Dumper $res;
が、Perl は結果をずーっと待っていて応答がない。
my $server = mprpc_server '127.0.0.1', '1985'; $server->reg_cb( echo => sub { my ($res_cv, @params) = @_; $res_cv->result(@params); } ); AnyEvent->condvar->recv;
こんな感じで Perl でサーバを書いたら Perl のクライアントは動いたんだけどなー。
ちなみに Python がクライアントでサーバが Perl でもちゃんと Python 側に処理は返った。