日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

python實(shí)現(xiàn)一個(gè)簡單RPC框架的示例

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

本文需要一點(diǎn)Python socket基礎(chǔ)。

回顧RPC

python實(shí)現(xiàn)一個(gè)簡單RPC框架的示例

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

實(shí)現(xiàn)jsonrpc

在實(shí)現(xiàn)前,簡單理一下整體思路。

1、Network Service 直接使用Python Socket相關(guān)的API實(shí)現(xiàn) 2.傳輸數(shù)據(jù)使用JSON,在Socket層會被壓成二進(jìn)制,我們無需關(guān)心。

模仿xmlrpc,Client與Server都采用Minix多繼承機(jī)制來實(shí)現(xiàn),每個(gè)類負(fù)責(zé)自身的事情,最終暴露出現(xiàn)的只有一個(gè)類中有限的方法。

先從Client端開始實(shí)現(xiàn)。

# 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}]’)

實(shí)例化rpcclient.RPCClient類,然后調(diào)用connect方法鏈接Server端,隨后直接調(diào)用Server端的add方法,該方法的效果就是將傳入的數(shù)據(jù)進(jìn)行累加并將累加的結(jié)果返回,最后將add方法返回的結(jié)果打印出了。

RPCClient類繼承于TCPClient類與RPCStub類。

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

其中TCPClient負(fù)責(zé)通過Socket實(shí)現(xiàn)TCP鏈接并將數(shù)據(jù)請求過去,而RPCStub類主要將Client端調(diào)用Server端方法的相關(guān)信息打包,然后調(diào)用TCPClient類中的方法發(fā)送則可,兩個(gè)類同樣實(shí)現(xiàn)在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):’’’將數(shù)據(jù)發(fā)送到Server端’’’self.sock.send(data) def recv(self, length):’’’接受Server端回傳的數(shù)據(jù)’’’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’)) # 發(fā)送數(shù)據(jù) data = self.recv(1024) # 接收方法執(zhí)行后返回的結(jié)果 return data setattr(self, function, _func)return _func

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

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

因?yàn)镽PCClient類本身沒有add方法,為了讓用戶做到Client端直接調(diào)用Server端方法的形式,先利用__getattr__構(gòu)建了_func方法,并將其通過setattr方法設(shè)置到RPCClient類中,此時(shí)該類就有Server端方法對應(yīng)的映射了。

調(diào)用add方法,就調(diào)用了對應(yīng)的_func方法,將數(shù)據(jù)發(fā)送至Server端。

Client端就這樣搞定了,接著來實(shí)現(xiàn)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) # 傳入要監(jiān)聽的端口

實(shí)例化rpcserver.RPCServer類,然后通過register_function方法將想被Client端調(diào)用的方法傳入,隨后調(diào)用loop方法,將要監(jiān)聽的端口傳入,RPCServer類的實(shí)現(xiàn)如下。

# rpcserver.py class RPCServer(TCPServer, JSONRPC, RPCStub): def __init__(self):TCPServer.__init__(self)JSONRPC.__init__(self)RPCStub.__init__(self) def loop(self, port):# 循環(huán)監(jiān)聽 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,這些類同樣實(shí)現(xiàn)在rpcserver.py文件中并且給出了詳細(xì)的注釋,所以就詳細(xì)解釋了。

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):’’’解析數(shù)據(jù)’’’self.data = json.loads(data.decode(’utf-8’)) def call_method(self, data):’’’解析數(shù)據(jù),調(diào)用對應(yīng)的方法變將該方法執(zhí)行結(jié)果返回’’’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端只可調(diào)用被注冊的方法’’’if name is None: name = function.__name__self.funs[name] = function

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

測試:

python實(shí)現(xiàn)一個(gè)簡單RPC框架的示例

以上就是python實(shí)現(xiàn)一個(gè)簡單RPC框架的示例的詳細(xì)內(nèi)容,更多關(guān)于python 實(shí)現(xiàn)RPC框架的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
狠狠操综合网| 少妇精品久久久一区二区| 国产va在线视频| 国产一区二区三区不卡av| 国产精品毛片| 国产精品亚洲欧美一级在线| 国产一区2区| 91一区二区三区四区| 亚洲一二av| 亚洲成人一区在线观看| 日本国产精品| 国产精品.xx视频.xxtv| 欧美手机在线| 国产欧美一区二区三区精品观看| 91精品蜜臀一区二区三区在线 | 亚洲精品伊人| 日韩激情精品| 欧美a在线观看| 免费人成精品欧美精品| 亚洲国产欧美日本视频| 精品72久久久久中文字幕| 久久影院午夜精品| 欧美片第1页综合| 伊人久久亚洲美女图片| 免费在线成人网| 夜夜嗨网站十八久久| 国产精品久久久久久模特| 国产韩日影视精品| 亚洲精品伊人| 午夜在线一区| 亚洲先锋成人| 国产一区二区三区网| 亚洲精品888| 在线天堂资源www在线污| 国产精品最新自拍| 日本欧美一区二区在线观看| av免费不卡国产观看| 麻豆精品少妇| 91麻豆精品激情在线观看最新 | 蜜桃av.网站在线观看| 91精品xxx在线观看| 国产一区国产二区国产三区| 午夜亚洲福利| 玖玖玖国产精品| 老司机免费视频一区二区| 日本不卡高清| 噜噜噜躁狠狠躁狠狠精品视频| 国户精品久久久久久久久久久不卡| 久久av在线| 黄色亚洲免费| 影音先锋国产精品| 免费精品视频最新在线| 精品欧美日韩精品| 国产精品99久久免费| 国产精品三p一区二区| 午夜av成人| 欧美日韩尤物久久| 91精品一区二区三区综合| 蜜桃av一区二区三区电影| 国产一区二区三区四区| 国产精品成人一区二区不卡| 久久精品亚洲| 在线视频日韩| 涩涩涩久久久成人精品| 91福利精品在线观看| 牛牛精品成人免费视频| 模特精品在线| 亚洲精品护士| 天堂va在线高清一区| 日韩欧美2区| 国产一区二区久久久久| 欧美日韩视频网站| 欧美手机在线| 91成人精品视频| 国产精品精品国产一区二区| 精品国产18久久久久久二百| 国产亚洲精品美女久久| 国产极品一区| 四虎成人av| 国产专区一区| 日韩一区二区在线免费| jiujiure精品视频播放| 日韩在线观看一区二区| 日韩中文字幕亚洲一区二区va在线| 亚洲一区二区日韩| 激情综合网五月| 免费观看在线综合色| 日本在线不卡视频| 性欧美长视频| 国产欧美综合一区二区三区| 国产一区国产二区国产三区| 国产福利资源一区| 在线日韩中文| 午夜久久av | 精品一区二区三区的国产在线观看| 久久99蜜桃| 久久亚洲国产| 麻豆9191精品国产| 精品中文在线| 婷婷丁香综合| 亚洲人妖在线| 欧美一区自拍| 久久精品高清| 日本不卡视频在线观看| 久久国内精品视频| 国产一区91| 国产精品黄色| 91久久亚洲| 日韩在线播放一区二区| 国产一区二区三区日韩精品| 欧美日韩国产综合网| 国产日韩亚洲| 男女男精品视频网| 久久精品一区二区三区中文字幕| 欧美aa国产视频| 色婷婷精品视频| 国产精品99免费看| 国产乱子精品一区二区在线观看| 日本精品在线中文字幕| 成人福利一区 | 亚洲专区欧美专区| 国产精品v一区二区三区| av亚洲在线观看| 日本亚洲最大的色成网站www| 日本不卡一区二区| 欧美福利在线| 九九久久国产| 亚洲三级av| 亚洲一级少妇| 免费久久久久久久久| 精品三级国产| 欧美私人啪啪vps| 香蕉久久国产| 国产66精品| 国产精品www994| 无码日韩精品一区二区免费| 久久久成人网| 成人国产精选| 国产精品久久久久久久久久齐齐 | 国产精品天天看天天狠| 亚洲激情久久| 久久久免费人体| 日韩免费福利视频| 亚洲一区观看| 日韩中文字幕高清在线观看| 国产麻豆一区| 少妇久久久久| 国产传媒在线| 国产精品久久乐| 午夜电影一区| 成人国产综合| 精品无人区麻豆乱码久久久| 日韩激情一区二区| av免费不卡国产观看| 亚洲中午字幕| 亚洲高清av| 久久人人97超碰国产公开结果| 日韩av资源网| 综合一区二区三区| 国产精品外国| 麻豆中文一区二区| 在线一区视频| 亚洲午夜精品久久久久久app| 91av亚洲| 91精品福利| 狠狠爱www人成狠狠爱综合网| 久久视频国产| 久久久久久夜| 日本不卡中文字幕| 日韩成人精品一区二区三区| 亚洲一二三区视频| 久久天堂精品| 女人av一区| 夜夜嗨一区二区三区| 丝袜a∨在线一区二区三区不卡| 美女在线视频一区| 精品一区不卡| 欧美gv在线| 亚洲女同一区| 亚洲精品.com| 免费久久99精品国产自在现线| 日韩视频一区| 亚洲aa在线| 国产私拍福利精品视频二区| 欧美日韩在线网站| 模特精品在线| 日本va欧美va精品发布| 国产伦精品一区二区三区千人斩| 亚洲深深色噜噜狠狠爱网站| 久久三级视频| 久久都是精品| 五月亚洲婷婷 | 国产麻豆久久| 免费不卡在线观看| 999国产精品999久久久久久| 99久久激情| 免费在线观看成人| 欧美激情麻豆| 国产综合色区在线观看| 三级欧美在线一区|