Python異步通信模塊asyncore解讀
Python異步通信模塊asyncore
Python的asyncore模塊提供了以異步的方式寫(xiě)入套接字服務(wù)的客戶(hù)端和服務(wù)器的基礎(chǔ)結(jié)構(gòu)。
模塊主要包括
asyncore.loop(…)
- 用于循環(huán)監(jiān)聽(tīng)網(wǎng)絡(luò)事件。loop()函數(shù)負(fù)責(zé)檢測(cè)一個(gè)字典,字典中保存dispatcher的實(shí)例。asyncore.dispatcher
類(lèi) - 一個(gè)底層套接字對(duì)象的簡(jiǎn)單封裝。這個(gè)類(lèi)有少數(shù)由異步循環(huán)調(diào)用的,用來(lái)事件處理的函數(shù)。dispatcher
類(lèi)中的writable()和readable()在檢測(cè)到一個(gè)socket可以寫(xiě)入或者數(shù)據(jù)到達(dá)的時(shí)候被調(diào)用,并返回一個(gè)bool值,決定是否調(diào)用handle_read或者h(yuǎn)andle_write。asyncore.dispatcher_with_send
類(lèi) - 一個(gè) dispatcher的子類(lèi),添加了簡(jiǎn)單的緩沖輸出能力,對(duì)簡(jiǎn)單的客戶(hù)端很有用。
例子
下面看一個(gè)簡(jiǎn)單的例子
import time import asyncore import socket import threading class EchoHandler(asyncore.dispatcher_with_send): def handle_read(self): data = self.recv(1024) if data: self.send(data) class EchoServer(asyncore.dispatcher): def __init__(self, host, port): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.set_reuse_addr() self.bind((host, port)) self.listen(5) def handle_accept(self): conn, addr = self.accept() print 'Incoming connection from %s' % repr(addr) self.handler = EchoHandler(conn) class EchoClient(asyncore.dispatcher): def __init__(self, host, port): asyncore.dispatcher.__init__(self) self.messages = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.connect((host, port)) def handle_connect(self): pass def handle_close(self): self.close() def handle_read(self): print self.recv(1024) def writable(self): return (len(self.messages) > 0) def handle_write(self): if len(self.messages) > 0: self.send(self.messages.pop(0)) class EchoServerThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): server = EchoServer('localhost', 9999) asyncore.loop() class EchoClientThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): client = EchoClient('localhost', 9999) asyncore.loop() EchoServerThread().start() time.sleep(2) EchoClientThread().start()
EchoServer - 響應(yīng)服務(wù)器端程序,負(fù)責(zé)監(jiān)聽(tīng)一個(gè)端口,并響應(yīng)客戶(hù)端發(fā)送的消息然后原樣返回給客戶(hù)端。
其中handle_accept()方法定義當(dāng)一個(gè)連接到來(lái)的時(shí)候要執(zhí)行的操作,這里指定了使用一個(gè)Handler來(lái)出來(lái)發(fā)送來(lái)的數(shù)據(jù)。
EchoHandler - 服務(wù)器端數(shù)據(jù)響應(yīng)類(lèi),接收數(shù)據(jù)并把數(shù)據(jù)原樣發(fā)回。
EchoClient - 響應(yīng)服務(wù)客戶(hù)端程序,負(fù)責(zé)連接響應(yīng)服務(wù)器。其中
messages
- 定義了一個(gè)要發(fā)送的消息列表,每次發(fā)送一個(gè)消息,知道列表為空為止。handle_read()
- 處理接收到的數(shù)據(jù),這里把收到的數(shù)據(jù)打印的終端上。writable()
- 判斷是否有數(shù)據(jù)可以向服務(wù)器端發(fā)送。handle_write()
- 當(dāng)writable()函數(shù)返回True時(shí),寫(xiě)入數(shù)據(jù)。
EchoServerThread - 用來(lái)啟動(dòng)服務(wù)器端程序的線(xiàn)程。
EchoClientThread - 用來(lái)啟動(dòng)客戶(hù)端端程序的線(xiàn)程。
測(cè)試
運(yùn)行上面的測(cè)試代碼,可以看到服務(wù)器和客戶(hù)端建立了連接后,響應(yīng)了客戶(hù)端發(fā)送來(lái)的10個(gè)數(shù)字,然后關(guān)閉了連接。
Incoming connection from ('127.0.0.1', 51424)
1
2
3
4
5
6
7
8
9
10
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python手機(jī)號(hào)前7位歸屬地爬蟲(chóng)代碼實(shí)例
這篇文章主要介紹了python手機(jī)號(hào)前7位歸屬地爬蟲(chóng)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Python能干什么、Python主要應(yīng)用于哪些方面
無(wú)論是從入門(mén)級(jí)選手到專(zhuān)業(yè)級(jí)選手都在做的爬蟲(chóng),還是Web程序開(kāi)發(fā)、桌面程序開(kāi)發(fā)還是科學(xué)計(jì)算、圖像處理, Python都可以勝任。Python為我們提供了非常完善的基礎(chǔ)代碼庫(kù),覆蓋了網(wǎng)絡(luò)、文件、GUI、 數(shù)據(jù)庫(kù)、文本等大量?jī)?nèi)容。用Python開(kāi)發(fā),許多功能不必從零編寫(xiě)2023-06-06python中快速進(jìn)行多個(gè)字符替換的方法小結(jié)
最近在用python給自己的seo工作提高效率和節(jié)省時(shí)間,發(fā)現(xiàn)python真的很不錯(cuò),可以完成很多事情。多個(gè)字符替換是大家可能都會(huì)遇到的一個(gè)問(wèn)題,昨天在工作中就碰到了這么一個(gè)問(wèn)題,所以想著記錄一下解決方案及其過(guò)程,方便以后參考。下面來(lái)一起看看吧。2016-12-12Matplotlib自定義圖例(多張圖共享一個(gè)圖例)
最近再用Matplotlib繪圖,需要做兩個(gè)子圖都不需要設(shè)置圖例,圖例單獨(dú)用一個(gè)figure來(lái)顯示,本文就詳細(xì)的來(lái)介紹一下,感興趣的可以了解一下2023-08-08python多進(jìn)程程序打包成exe的問(wèn)題
這篇文章主要介紹了python多進(jìn)程程序打包成exe的問(wèn)題的相關(guān)資料,需要的朋友可以參考下2022-12-12python正則爬取某段子網(wǎng)站前20頁(yè)段子(request庫(kù))過(guò)程解析
這篇文章主要介紹了python正則爬取某段子網(wǎng)站前20頁(yè)段子(request庫(kù))過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08基于Python編寫(xiě)一個(gè)桌面時(shí)鐘屏保
這篇文章主要為大家詳細(xì)介紹了如何基于Python編寫(xiě)一個(gè)桌面時(shí)鐘屏保效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12pytorch教程之網(wǎng)絡(luò)的構(gòu)建流程筆記
這篇文章主要介紹了pytorch教程中網(wǎng)絡(luò)的構(gòu)建流程,文中附含了詳細(xì)的示例代碼流程,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09