目次
はじめに
リモートプロシージャコール(RPC)は、ネットワーク越しに他のコンピュータのプロシージャ(関数)を呼び出すためのプロトコルの一つです。本記事では、Pythonのソケットプログラミングを使って、RPCの基本的な実装を行います。必要な環境
基本的なRPCの実装
まずは、基本的なRPCのサーバーとクライアントを作成してみましょう。RPCサーバーの作成
以下は、Pythonで簡単なRPCサーバーを作成する例です。import socket
import json
def add(a, b):
return a + b
# ソケットオブジェクトの作成
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("localhost", 5000))
server_socket.listen(1)
while True:
client_socket, addr = server_socket.accept()
data = client_socket.recv(1024)
request = json.loads(data.decode("utf-8"))
# "method"と"params"を解析して関数を呼び出す
method = request.get("method")
params = request.get("params")
if method == "add":
result = add(*params)
response = json.dumps({"result": result})
client_socket.send(response.encode("utf-8"))
client_socket.close()
RPCクライアントの作成
次に、RPCサーバーに接続して`add`関数をリモートで呼び出すクライアントを作成します。import socket
import json
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("localhost", 5000))
request = json.dumps({"method": "add", "params": [1, 2]})
client_socket.send(request.encode("utf-8"))
data = client_socket.recv(1024)
response = json.loads(data.decode("utf-8"))
print(response["result"])
応用例
基本的な実装ができたところで、少し応用的な使い方を見ていきましょう。複数の関数を提供するRPCサーバー
1つのRPCサーバーで複数の関数を提供する方法です。# 上記のサーバーコードに以下の関数を追加
def multiply(a, b):
return a * b
# 既存のwhileループ内に以下を追加
if method == "multiply":
result = multiply(*params)
エラーハンドリングの追加
エラーハンドリングを追加して、不正なリクエストが来た場合に適切に対応する方法です。try:
if method == "add":
result = add(*params)
elif method == "multiply":
result = multiply(*params)
else:
raise ValueError("不明なメソッドです")
except Exception as e:
response = json.dumps({"error": str(e)})
else:
response = json.dumps({"result": result})
client_socket.send(response.encode("utf-8"))
コメント