• http post协议实现简单的rpc协议,WireShark抓包分析


    1.http 客户端-RPC客户端

    import json
    import requests
    
    # 定义 RPC 客户端类
    class RPCClient:
        def __init__(self, server_url):
            self.server_url = server_url
    
        def call(self, method, params):
            # 构建 JSON-RPC 请求
            request_data = {
                'method': method,
                'params': params,
                'id': 1
            }
            #json数据转化为网络字节流数据
            json_data = json.dumps(request_data).encode('utf-8')
    
            # 发送 POST 请求
            response = requests.post(self.server_url, json_data, headers={'Content-type': 'application/json'})
    
            # 解析响应
            result = response.json()
            if 'error' in result:
                raise Exception(result['error'])
            return result['result']
    
    # 创建 RPC 客户端实例
    client = RPCClient('http://192.168.1.9:8000')
    
    # 调用远程方法
    result = client.call('add', [3, 5])
    print("Result:", result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    1.http 服务端-RPC服务端

    import json
    from http.server import BaseHTTPRequestHandler, HTTPServer
    
    # 自定义处理程序类
    class RPCHandler(BaseHTTPRequestHandler):
        def do_POST(self):
            # 解析接收到的 JSON 数据
            content_length = int(self.headers['Content-Length'])
            json_data = self.rfile.read(content_length).decode('utf-8')
            print("-------json_data:{}".format(json_data))
            data = json.loads(json_data)
            print("-------data:{}".format(data))
            # 处理 RPC 请求
            result = self.process_request(data)
    
            # 构建响应
            self.send_response(200)
            self.send_header('Content-type', 'application/json')
            self.end_headers()
            # 将python对象转为json字符串,encode用于将字符串转换为字节流b开头,默认用utf-8编码
            print(json.dumps(result).encode('utf-8'))
            self.wfile.write(json.dumps(result).encode('utf-8'))
    
        def process_request(self, data):
            # 在这里处理 RPC 请求
            # 根据请求内容调用相应的函数或方法
            # 返回结果
            if 'method' in data:
                method = data['method']
                if method == 'add':
                    if 'params' in data and len(data['params']) == 2:
                        a, b = data['params']
                        result = a + b
                        return {'result': result}
            return {'error': 'Invalid request'}
    
    # 启动 RPC 服务器
    def run_server():
        port = 8000
        server_address = ('192.168.1.9', port)
        httpd = HTTPServer(server_address, RPCHandler)
        httpd.serve_forever()
    
    if __name__ == '__main__':
        run_server()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    在这里插入图片描述

    3.WireShark抓包分析

    在这里插入图片描述

    3.1客户端到服务端的HTTP/JSON报文

    在这里插入图片描述

    3.2服务端到客户端的HTTP/JSON报文

    在这里插入图片描述

  • 相关阅读:
    ubuntu18.04 ros 安装 gazebo9
    面试官:说一下 MyBatis 缓存机制?
    vmware虚拟机安装centos7及网络配置
    让你深入理解Java IO流
    Java实现本地缓存、分布式缓存及多级缓存
    matplotlib.animation 3d姿态动画
    FullCalendarDemo5 控件的实例讲解—拖拽实现值班排班(五)
    Java项目:JSP小说网
    N9917A|是德科技keysight N9917A微波分析仪
    MySQL SQL优化
  • 原文地址:https://blog.csdn.net/Wwc_code/article/details/133999093