Pythonのsocket通信やsocketserverの使い方を簡単にみてきましたが、ここではXML-RPCでサーバーとクライアントのやり取りをみていこうと思います。
RPCとはRemote Procedure Callの略で遠隔手続き呼び出しを実現する方法で、XML-RPCを使うと、HTTP経由でクライアント側からサーバー上のメソッドを引数付きで呼び出すことで、構造化されたデータを受け取る事ができます。
XML-RCPサーバーとクライアント
ではさっそくxmlrpcモジュールを使ってコードを書いて、動きを見ていきましょう。
まずはサーバー側から。
xmlrpc.server
xmlrpcモジュールをインポートして、サーバー側のコードから書いていきましょう。
from xmlrpc.server import SimpleXMLRPCServer
with SimpleXMLRPCServer(('127.0.0.1', 8000)) as server:
def hello():
return 'Hello, Pyhton!'
def add_calc(x, y):
return x + y
server.register_function(hello, "hello")
server.register_function(add_calc, "add")
server.serve_forever()
xmlrpc.serverモジュールのSimpleXMLRPCServerをインポートします。
withステートメントでSimpleXMLRPCServer()を開き、IPアドレスとポート番号を指定し、serverとします。
ここではクライアントからのリクエストに応答する関数を2つ定義しました。hello()で「Hello, Python!」を返す関数と、add_calc()でxとyの足し算を返す関数です。
server.register_function()でクライアントからのリクエストに応答する関数を登録します。ここでは関数を2つ用意したので2つ登録します。定義した関数と、クライアントから呼びだすメソッド名を記入しています。
serve_forever()でサーバーの応答待ちになります。
xmlrpc.client
今度は、クライアント側のコードから書いていきましょう。
import xmlrpc.client
with xmlrpc.client.ServerProxy('http://127.0.0.1:8000/') as proxy:
print(proxy.hello())
print(proxy.add(100, 200))
xmlrpc.clientモジュールをインポートします。
withステートメントでclient.ServerProxy()を開き、サーバーのURLを指定してproxyとします。
proxy.hello()とproxy.add()でサーバーを呼び出し、printで結果を表示します。ここではサーバー側で設定したメソッド名を記述して引数を渡しています。
スクリプトの実行
上で書いたコードについて、サーバー側のコードはrpc_server.py、クライアント側のコードはrpc_client.pyとしてここでは保存しておきます。
ターミナルを2つ起動してそれぞれのスクリプトを実行します。
まずはサーバー側。
$ python rpc_server.py
エラーがないので応答待ちの状態になっています。
もう1つのターミナルから、クライアントのスクリプトを実行します。
$ python rpc_client.py
クライアントを実行すると、結果が返ってきて表示されています。
クライアント側に書いたメソッドと引数がサーバー側に渡され、サーバー側で応答を待っていた関数がそれに基づいて実行されて結果を表示しています。ここではサーバー側に用意した文字列と、クライアント側に指定した引数の100と200をサーバー側の関数で計算した値が表示されています。
まるで、サーバー側のメソッドをインポートして使っているような動きになっています。
最後に
ここではPythonのxmlrpcモジュール使うことで、HTTP経由でクライアント側からサーバー上のメソッドを呼び出す操作をしてみました。
とても簡単な方法となっていますが、処理するデータによっては時間がかかることがあります。クライアントでやるには重たいデータ処理をサーバー側で行うような状況などでの利用が考えられます。
クライアント側で色々な処理を行っている場合、サーバー側の処理が通信ネットワークの状況によって遅延するなどの場合があって処理に不具合が生じたりすることがあります。
会社などの内部ネットワークなどで簡単にコードを試したりするような使い方をするのがいいのではないかとも言われています。