前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RPC(五)

RPC(五)

作者头像
小闫同学啊
发布2019-07-18 15:45:59
1.6K0
发布2019-07-18 15:45:59
举报
文章被收录于专栏:小闫笔记小闫笔记

正文共:2098 字 5 图 预计阅读时间:6 分钟

每日分享

What gets measured gets managed.

只有能被测量的,才能被管理。

小闫语录

度量是一种直观展示的方式,是管理的依据。当各种运动手环、各种步数记录软件出现时,人们才发现原来自己运动量这么少。通过排行榜上的对比才发现自己的懒惰。看到手机上完成5000步目标的提示,你很开心。当步数可以被测量之后,人们才对自己的健康做到更好的管理。

生活亦是如此,你并非无法做到某事,而是缺少管理,当你的目标被细化,过程被管理时,结果只是一种选择。

RPC

GitHub地址:

代码语言:javascript
复制
https://github.com/EthanYan6/rpc_divide.git

为了方便大家查看,我将RPC相关的代码放在了GitHub上面,大家可以clone到本地进行查看。

历史文章导航:

RPC(一)

RPC(二)

RPC(三)

RPC(四)

1.请求消息协议实现测试

在上一篇文章中,我们实现了调用请求消息的相关代码。到底效果如何呢?我们来测试一下。

代码语言:javascript
复制
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没有使用默认值:

代码语言:javascript
复制
divide
{'num1': 200, 'num2': 100}

num2使用默认值:

代码语言:javascript
复制
divide
{'num1': 200}

可以通过结果,说明我们的代码没有问题。

2.返回值数据转换为消息数据的实现

返回值数据转换的时候,我们需要考虑两种情况,一种是返回float类型的数据(即正常情况),一种是InvalidOpreation(即异常情况)。同样,根据当时的设计,完成下面的代码部分:

代码语言:javascript
复制
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

3.消息数据转换为返回值数据的实现

按照我们之前的思路,既然有了返回值数据的编码操作了,总得有个解码的方法,因此下面我们将会实现一个将消息数据还原为返回值数据的方法。

代码语言:javascript
复制
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的传输协议部分,尽情期待吧。

优质文章推荐:

redis操作命令总结

MySQL相关操作

SQL查询语句

前端中那些让你头疼的英文单词

Flask框架重点知识总结回顾

团队开发注意事项

浅谈密码加密

Django框架中的英文单词

Django中数据库的相关操作

DRF框架中的英文单词

DRF框架

Django相关知识点回顾

python技术面试题-腾讯

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈技术精选 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 每日分享
  • RPC
    • 1.请求消息协议实现测试
      • 2.返回值数据转换为消息数据的实现
        • 3.消息数据转换为返回值数据的实现
        相关产品与服务
        云数据库 MySQL
        腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档