bsonrpc 是python中⼀個(gè)基于json或bson的遠(yuǎn)程過(guò)程調(diào)⽤的庫(kù),提供了服務(wù)端與客戶端實(shí)現(xiàn),其底層采⽤的是基于TCP連接的通信。
bsonrpc主要包括以下⽂件:
本⽂主要描述庫(kù)包中對(duì)于不同協(xié)議的分包組包的處理,涉及到socket_queue.py和framing.py⽂件,主要采⽤的是對(duì)象組合的技術(shù)。
socket_queue.py中的SocketQueue類是⽤來(lái)處理從socket接收數(shù)據(jù),主要的⽅法為_(kāi)receiver()和put()⽅法,分別對(duì)應(yīng)分包和組包,分包的主要內(nèi)容如下:
def _receiver(self): bbuffer = b'' while True: try: chunk = self.socket.recv(self.BUFSIZE) # 從socket上接收數(shù)據(jù) bbuffer = self._to_queue(bbuffer + chunk) # 數(shù)據(jù)分包 except DecodingError as e: self._queue.put(e) # 后⾯省略... def _to_queue(self, bbuffer): b_msg, bbuffer = self.codec.extract_message(bbuffer) # 解碼器提取完整的信息 while b_msg is not None: self._queue.put(self.codec.loads(b_msg)) # 解碼后的消息放⼊消息隊(duì)列中等待處理 b_msg, bbuffer = self.codec.extract_message(bbuffer) return bbuffer
組包的主要內(nèi)容如下:
def put(self, item): if self._closed: raise BsonRpcError('Attempt to put items to closed queue.') msg_bytes = self.codec.into_frame(self.codec.dumps(item)) # 組包 with self._lock: self.socket.sendall(msg_bytes)
如上圖所示,程序采⽤的是對(duì)象組合的⽅式實(shí)現(xiàn)消息分包處理的。對(duì)象組合是繼承之外的另⼀種選擇,對(duì)象組合要求被組合的對(duì)象具有良好定義的接⼝,通過(guò)接⼝的⽅式調(diào)⽤其他對(duì)象的功能,這個(gè)也被“⿊箱復(fù)⽤”,因?yàn)閷?duì)象的內(nèi)部細(xì)節(jié)是不可⻅的。SocketQueue中依賴Codec的extract_message()接⼝⽅法,不⽤關(guān)⼼其具體的實(shí)現(xiàn)⽅法。具體實(shí)現(xiàn)由JSONCodec和BSONCode進(jìn)⾏實(shí)現(xiàn)。JSONCodec中依賴JSONFrame中的extract_message()接⼝⽅法,該接⼝⽅法的實(shí)現(xiàn)由JSONFramingNone、JSONFramingNetstring、JSONFramingRFC7464進(jìn)⾏實(shí)現(xiàn)。SocketQueue消息組包過(guò)程依賴于into_frame()⽅法,也是通過(guò)對(duì)象組合實(shí)現(xiàn)的。
注:圖中的接⼝為了⼤家容易理解才加上了,源碼⾥⾯并沒(méi)有。
以上就是Python bsonrpc源碼解讀的詳細(xì)內(nèi)容,更多關(guān)于Python bsonrpc源碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:梅州 西寧 文山 石家莊 錫林郭勒盟 昆明 浙江 懷化
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python bsonrpc源碼解讀》,本文關(guān)鍵詞 Python,bsonrpc,源碼,解讀,Python,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。