文章目录
- [1.http 客户端-RPC客户端](#1.http 客户端-RPC客户端)
- [1.http 服务端-RPC服务端](#1.http 服务端-RPC服务端)
- 3.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()