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

文章目录

1.http 客户端-RPC客户端

python 复制代码
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.http 服务端-RPC服务端

python 复制代码
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()

3.WireShark抓包分析

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

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

相关推荐
Yves..14 小时前
HTTP 协议学习笔记:从报文结构到抓包实践
网络协议·http·fiddler
沫璃染墨14 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
小贾要学习1 天前
【C++后端开发项目】Reactor 模型 / C++ 仿写 muduo HTTP 服务器:让底层网络库真正跑起网页
linux·服务器·c++·http·网络编程·muduo·reactor模型
小园子的小菜1 天前
Netty 核心组件 Channel、ChannelHandler 与简易 RPC 架构实战详解
网络协议·rpc·架构
跨境数据猎手2 天前
HTTP 响应体编码与压缩:识别、解码
网络协议·http·ios
MicrosoftCloud2 天前
计网 14|HTTP 协议核心:报文结构、状态码、持续连接
计算机网络·考研·http·状态码·408·万维网·持续连接
最强小杰3 天前
minimax-m3 突然报 HTTP 529 怎么办?连续重试为何更难恢复,退避时间该怎么算?
网络·网络协议·http·ai
Thanks_ks3 天前
常见 HTTP 状态码的坑:301/302、401/403、500/502 之间差的那一个词
计算机网络·nginx·http·面试·状态码·后端开发·浏览器缓存
笔绘丹心3 天前
测试工程师的 BLE 抓包实战:从开关到 Wireshark 逐帧解读(红米/小米避坑版)
wireshark·抓包·ble