正文共:2098 字 5 图 预计阅读时间:6 分钟
What gets measured gets managed.
只有能被测量的,才能被管理。
小闫语录:
度量是一种直观展示的方式,是管理的依据。当各种运动手环、各种步数记录软件出现时,人们才发现原来自己运动量这么少。通过排行榜上的对比才发现自己的懒惰。看到手机上完成5000步目标的提示,你很开心。当步数可以被测量之后,人们才对自己的健康做到更好的管理。
生活亦是如此,你并非无法做到某事,而是缺少管理,当你的目标被细化,过程被管理时,结果只是一种选择。
GitHub地址:
https://github.com/EthanYan6/rpc_divide.git
为了方便大家查看,我将RPC相关的代码放在了GitHub上面,大家可以clone到本地进行查看。
历史文章导航:
在上一篇文章中,我们实现了调用请求消息的相关代码。到底效果如何呢?我们来测试一下。
if __name__ == '__main__':
# 构造消息数据
proto = DivideProtocol()
# divide(200, 100)
# message = proto.args_encode(200, 100)
# divide(200)
message = proto.args_encode(200)
# 模拟网络连接
conn = BytesIO()
conn.write(message)
conn.seek(0)
# 解析消息数据
method_proto = MethodProtocol(conn)
name = method_proto.get_method_name()
print(name)
args = proto.args_decode(conn)
print(args)
上述代码分别测试了默认值以及不用默认值的情况,输出结果如下:
num2没有使用默认值:
divide
{'num1': 200, 'num2': 100}
num2使用默认值:
divide
{'num1': 200}
可以通过结果,说明我们的代码没有问题。
返回值数据转换的时候,我们需要考虑两种情况,一种是返回float类型的数据(即正常情况),一种是InvalidOpreation(即异常情况)。同样,根据当时的设计,完成下面的代码部分:
def result_encode(self, result):
"""
将原始结果数据转换为消息协议二进制数据
:param result: 原始结果数据 float InvalidOperation
:return: bytes 消息协议二进制数据
"""
# 正常
if isinstance(result, float):
# 处理返回值类型
buff = struct.pack('!B', 1)
buff += struct.pack('!f', result)
return buff
# 异常
else:
# 处理返回值类型
buff = struct.pack('!B', 2)
# 处理返回值
length = len(result.message)
# 处理字符串长度
buff += struct.pack('!I', length)
# 处理字符
buff += result.message.encode()
return buff
按照我们之前的思路,既然有了返回值数据的编码操作了,总得有个解码的方法,因此下面我们将会实现一个将消息数据还原为返回值数据的方法。
def result_decode(self, connection):
"""
将返回值消息数据转换为原始返回值
:param connection: socket BytesIO
:return: float InvalidOperation对象
"""
self.conn = connection
# 处理返回值类型
buff = self._read_all(1)
result_type = struct.unpack('!B', buff)[0]
if result_type == 1:
# 正常情况
# 读取float数据
buff = self._read_all(4)
val = struct.unpack('!f', buff)[0]
return val
else:
# 异常情况
# 读取字符串的长度
buff = self._read_all(4)
length = struct.unpack('!I', buff)[0]
# 读取字符串
buff = self._read_all(length)
message = buff.decode()
return InvalidOpreation(message)
到此为止,RPC的消息协议就实现完成了。下一篇文章将会将RPC的传输协议部分,尽情期待吧。
优质文章推荐: