电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

python實現一個簡單RPC框架的示例

瀏覽:106日期:2022-07-06 18:30:56

本文需要一點Python socket基礎。

回顧RPC

python實現一個簡單RPC框架的示例

客戶端(Client):服務調用方。 客戶端存根(Client Stub):存放服務端地址信息,將客戶端的請求參數數據信息打包成網絡消息,再通過網絡傳輸發送給服務端。 服務端存根(Server Stub):接收客戶端發送過來的請求消息并進行解包,然后再調用本地服務進行處理。 服務端(Server):服務的真正提供者。 Network Service:底層傳輸,可以是 TCP 或 HTTP。

實現jsonrpc

在實現前,簡單理一下整體思路。

1、Network Service 直接使用Python Socket相關的API實現 2.傳輸數據使用JSON,在Socket層會被壓成二進制,我們無需關心。

模仿xmlrpc,Client與Server都采用Minix多繼承機制來實現,每個類負責自身的事情,最終暴露出現的只有一個類中有限的方法。

先從Client端開始實現。

# client.py import rpcclient c = rpcclient.RPCClient()c.connect(’127.0.0.1’, 5000)res = c.add(1, 2, c=3)print(f’res: [{res}]’)

實例化rpcclient.RPCClient類,然后調用connect方法鏈接Server端,隨后直接調用Server端的add方法,該方法的效果就是將傳入的數據進行累加并將累加的結果返回,最后將add方法返回的結果打印出了。

RPCClient類繼承于TCPClient類與RPCStub類。

# rpclient.pyclass RPCClient(TCPClient, RPCStub): pass

其中TCPClient負責通過Socket實現TCP鏈接并將數據請求過去,而RPCStub類主要將Client端調用Server端方法的相關信息打包,然后調用TCPClient類中的方法發送則可,兩個類同樣實現在rpclient.py文件中,代碼如下。

class TCPClient(object): def __init__(self):self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) def connect(self, host, port):’’’鏈接Server端’’’self.sock.connect((host, port)) def send(self, data):’’’將數據發送到Server端’’’self.sock.send(data) def recv(self, length):’’’接受Server端回傳的數據’’’return self.sock.recv(length) class RPCStub(object): def __getattr__(self, function):def _func(*args, **kwargs): d = {’method_name’: function, ’method_args’: args, ’method_kwargs’: kwargs} self.send(json.dumps(d).encode(’utf-8’)) # 發送數據 data = self.recv(1024) # 接收方法執行后返回的結果 return data setattr(self, function, _func)return _func

TCPClient類就是常規的Socket API的操作,無需多言,主要看看RPCStub類。

當我們在Client端調用res = c.add(1, 2, c=3)時,會執行RPCStub中的__getattr__方法,該方法會將Client端調用的方法、參數等信息通過TCPServer類的send方法發送,發送數據進行了JSON格式化,方便Server端解碼,隨后便調用recv方法等待Server端相應的數據返回。

因為RPCClient類本身沒有add方法,為了讓用戶做到Client端直接調用Server端方法的形式,先利用__getattr__構建了_func方法,并將其通過setattr方法設置到RPCClient類中,此時該類就有Server端方法對應的映射了。

調用add方法,就調用了對應的_func方法,將數據發送至Server端。

Client端就這樣搞定了,接著來實現Server端,不用緊張,非常簡單。

Server端的使用方式如下。

# server.py import rpcserver def add(a, b, c=10): sum = a + b + c return sum s = rpcserver.RPCServer()s.register_function(add) # 注冊方法s.loop(5000) # 傳入要監聽的端口

實例化rpcserver.RPCServer類,然后通過register_function方法將想被Client端調用的方法傳入,隨后調用loop方法,將要監聽的端口傳入,RPCServer類的實現如下。

# rpcserver.py class RPCServer(TCPServer, JSONRPC, RPCStub): def __init__(self):TCPServer.__init__(self)JSONRPC.__init__(self)RPCStub.__init__(self) def loop(self, port):# 循環監聽 5000 端口self.bind_listen(port)print(’Server listen 5000 ...’)while True: self.accept_receive_close() def on_msg(self, data):return self.call_method(data)

RPCServer繼承自TCPServer、JSONRPC、RPCStub,這些類同樣實現在rpcserver.py文件中并且給出了詳細的注釋,所以就詳細解釋了。

class TCPServer(object): def __init__(self):self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) def bind_listen(self, port):self.sock.bind((’0.0.0.0’, port))self.sock.listen(5) def accept_receive_close(self):’’’獲取Client端信息’’’(client_socket, address) = self.sock.accept()msg = client_socket.recv(1024)data = self.on_msg(msg)client_socket.sendall(data) # 回傳client_socket.close() class JSONRPC(object): def __init__(self):self.data = None def from_data(self, data):’’’解析數據’’’self.data = json.loads(data.decode(’utf-8’)) def call_method(self, data):’’’解析數據,調用對應的方法變將該方法執行結果返回’’’self.from_data(data)method_name = self.data[’method_name’]method_args = self.data[’method_args’]method_kwargs = self.data[’method_kwargs’]res = self.funs[method_name](*method_args, **method_kwargs)data = {'res': res}return json.dumps(data).encode(’utf-8’) class RPCStub(object): def __init__(self):self.funs = {} def register_function(self, function, name=None):’’’Server端方法注冊,Client端只可調用被注冊的方法’’’if name is None: name = function.__name__self.funs[name] = function

至此,Client端和Server端都寫好了。

測試:

python實現一個簡單RPC框架的示例

以上就是python實現一個簡單RPC框架的示例的詳細內容,更多關于python 實現RPC框架的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: Brotu | 关注AI,Web3.0,VR/AR,GPT,元宇宙区块链数字产业 | 冷藏车厂家|冷藏车价格|小型冷藏车|散装饲料车厂家|程力专用汽车股份有限公司销售十二分公司 | 非甲烷总烃分析仪|环控百科| 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 北京公寓出租网-北京酒店式公寓出租平台 | 汕头市盛大文化传播有限公司,www.11400.cc | 旋转气浴恒温振荡器-往复式水浴恒温振荡器-金怡百科 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 电动高压冲洗车_价格-江苏速利达机车有限公司 | 超声波清洗机_大型超声波清洗机_工业超声波清洗设备-洁盟清洗设备 | 培训一点通 - 合肥驾校 - 合肥新亚驾校 - 合肥八一驾校 | 地埋式垃圾站厂家【佳星环保】小区压缩垃圾中转站转运站 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 数控走心机-双主轴走心机厂家-南京建克 | 电采暖锅炉_超低温空气源热泵_空气源热水器-鑫鲁禹电锅炉空气能热泵厂家 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | HYDAC过滤器,HYDAC滤芯,现货ATOS油泵,ATOS比例阀-东莞市广联自动化科技有限公司 | 螺杆泵_中成泵业| 整合营销推广|营销网络推广公司|石家庄网站优化推广公司|智营销 好物生环保网、环保论坛 - 环保人的学习交流平台 | 南京泽朗生物科技有限公司-液体饮料代加工_果汁饮料代加工_固体饮料代加工 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 南京兰江泵业有限公司-水解酸化池潜水搅拌机-絮凝反应池搅拌机-好氧区潜水推进器 | 铁盒_铁罐_马口铁盒_马口铁罐_铁盒生产厂家-广州博新制罐 | 电子书导航网_电子书之家_电子书大全_最新电子书分享发布平台 | 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 分类168信息网 - 分类信息网 免费发布与查询 | 淄博不锈钢无缝管,淄博不锈钢管-鑫门物资有限公司 | 武汉创亿电气设备有限公司_电力检测设备生产厂家 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 「安徽双凯」自动售货机-无人售货机-成人用品-自动饮料食品零食售货机 | 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 无尘烘箱_洁净烤箱_真空无氧烤箱_半导体烤箱_电子防潮柜-深圳市怡和兴机电 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 电磁辐射仪-电磁辐射检测仪-pm2.5检测仪-多功能射线检测仪-上海何亦仪器仪表有限公司 | 房在线-免费房产管理系统软件-二手房中介房屋房源管理系统软件 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 |