基于RMI技术的远程词典应用-Python(分布式系统实验一)

RMI技术

RMI, 远程方法调用,可以通过socket通讯和对象序列化技术来实现,RMI是远程过程调用(RPC)的一种面向对象实现[1]。
RMI的发生过程可以使用下图理解,图片来源[2]。

基于RMI技术的远程词典应用-Python(分布式系统实验一)

可以通过客户对象、客户辅助对象、服务辅助对象和服务对象四个对象来完成不同机器上的RMI过程。

远程词典应用-Python实现

在本实验中,服务器只提供一个翻译服务,使问题简化,无需建立客户辅助对象,只同通过翻译服务对象、服务辅助对象、客户对象三个对象完成RMI过程。代码使用Python语言实现。

翻译服务对象

class Translator:
    def __init__(self):
        self.dict = {"China": "中国", "hello": "您好"}

    def get_chinese_from_english(self, key):
        return self.dict[key]

服务辅助对象

class Server:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port
        self.translator = Translator()

    def listen(self):
        ser = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ser.bind((self.ip, self.port))
        ser.listen()
        while True:
            sock, addr = ser.accept()
            arg = sock.recv(1024).decode("utf-8")
            res = self.translator.get_chinese_from_english(arg)
            sock.send(bytes(res, "utf-8"))
            sock.close()

客户对象

class Client:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    def translate(self, arg):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect((self.ip, self.port))
        sock.send(bytes(arg, "utf-8"))
        print(f"Request the result of :{arg}")
        return sock.recv(1024).decode("utf-8")

结果

首先运行以下代码启动服务器:

if __name__ == "__main__":
    client = Client("127.0.0.1", 8088)
    print("=====Translator Client Ready=====")
    res = client.translate("China")
    print(f"Get the result from server:{res}")

结果如下:
基于RMI技术的远程词典应用-Python(分布式系统实验一)

再运行以下程序启动客户端:

if __name__ == "__main__":
    client = Client("127.0.0.1", 8088)
    print("=====Translator Client Ready=====")
    res = client.translate("China")
    print(f"Get the result from server:{res}")

结果如下;
基于RMI技术的远程词典应用-Python(分布式系统实验一)

参考文献

  1. RMI原理与示例
  2. RMI实现
上一篇:记一次Linux内核中socket源码走读


下一篇:2-5:套接字(Socket)编程之从内核角度深入理解套接字