RMI技术
RMI, 远程方法调用,可以通过socket通讯和对象序列化技术来实现,RMI是远程过程调用(RPC)的一种面向对象实现[1]。
RMI的发生过程可以使用下图理解,图片来源[2]。
可以通过客户对象、客户辅助对象、服务辅助对象和服务对象四个对象来完成不同机器上的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}")
结果如下:
再运行以下程序启动客户端:
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}")
结果如下;
参考文献