Python?asyncore?socket客戶端開(kāi)發(fā)基本使用教程
介紹
asyncore庫(kù)是python的一個(gè)標(biāo)準(zhǔn)庫(kù),提供了以異步的方式寫(xiě)入套接字服務(wù)的客戶端和服務(wù)器的基礎(chǔ)結(jié)構(gòu)。操作網(wǎng)絡(luò)的時(shí)候可以直接使用socket等底層的庫(kù),但是asyncore使得我們可以更加方便的操作網(wǎng)絡(luò),避免直接使用socket,select,poll等工具時(shí)需要面對(duì)的復(fù)雜情況。
1.定義類(lèi)并且繼承 asyncore.dispatcher
class SocketClient(asyncore.dispatcher):
2.實(shí)現(xiàn)類(lèi)中的回調(diào)代碼
調(diào)用父類(lèi)方法
asyncore.dispatcher.__init__(self)
創(chuàng)建 socket 對(duì)象
self.create_socket()
連接服務(wù)器
address = (host, port) self.connect(address)
實(shí)現(xiàn) handle_connect 回調(diào)函數(shù)
當(dāng)socket 連接服務(wù)器成功時(shí)回調(diào)該函數(shù)
def handle_connect(self):
print('連接成功')實(shí)現(xiàn) writable 回調(diào)函數(shù)
描述是否有數(shù)據(jù)需要被發(fā)送到服務(wù)器。返回值為T(mén)rue表示可寫(xiě),F(xiàn)alse 表示不可寫(xiě)。
如果不識(shí)閑默認(rèn)返回為 True,當(dāng)返回True時(shí),回調(diào)函數(shù)handle_write將被觸發(fā)
def writable(self):
return False實(shí)現(xiàn) handle_write 回調(diào)函數(shù)
當(dāng)有數(shù)據(jù)需要發(fā)送時(shí) (writable 回調(diào)函數(shù)返回 True時(shí)),
該函數(shù)被觸發(fā),通常情況下在該函數(shù)中編寫(xiě)send方法發(fā)送數(shù)據(jù)
def handle_write(self):
# 內(nèi)部實(shí)現(xiàn)對(duì)服務(wù)器發(fā)送數(shù)據(jù)
# 調(diào)用 send 方法,參數(shù)是字節(jié)數(shù)據(jù)
self.send('hello world'.encode('utf-8'))實(shí)現(xiàn) readable 回調(diào)函數(shù)
描述是否有數(shù)據(jù)從服務(wù)端讀取。返回True標(biāo)識(shí)有數(shù)據(jù)需要讀取,
False表示沒(méi)有數(shù)據(jù)需要被讀取,當(dāng)不實(shí)現(xiàn)默認(rèn)返回True,
當(dāng)返回True時(shí),handle_read將被觸發(fā)
def readable(self):
# 表示有數(shù)據(jù)需要讀取
return True實(shí)現(xiàn) handle_read 回調(diào)函數(shù)
當(dāng)有數(shù)據(jù)需要讀取時(shí)(readable 回調(diào)函數(shù)返回True時(shí)),
該函數(shù)被觸發(fā),通常情況下在該函數(shù)中編寫(xiě)recv方法接收數(shù)據(jù)
def handle_read(self):
# 主動(dòng)讀取接收數(shù)據(jù) 參數(shù)是需要接收數(shù)據(jù)長(zhǎng)度
result = self.recv(8000)
print(result)實(shí)現(xiàn) handle_error 回調(diào)函數(shù)
當(dāng)程序運(yùn)行過(guò)程發(fā)生異常時(shí)回調(diào)
def handle_error(self):
# 編寫(xiě)處理錯(cuò)誤方法
t, e, trace = sys.exc_info()
print(t, e, trace)實(shí)現(xiàn) handle_close 回調(diào)函數(shù)
當(dāng)連接被關(guān)閉時(shí)觸發(fā)
def handle_close(self):
print('連接關(guān)閉')
# 執(zhí)行關(guān)閉
self.close()3.創(chuàng)建對(duì)象并且執(zhí)行 asyncore.loop 進(jìn)入運(yùn)行循環(huán)
timeout為一次循環(huán)所用的時(shí)間,也就是超時(shí)時(shí)間。
client = SocketClient('127.0.0.1', 9000)
# 開(kāi)始啟動(dòng)運(yùn)行循環(huán)
asyncore.loop(timeout=10)服務(wù)端示例代碼
import asyncore
import socket
class EchoHandler(asyncore.dispatcher_with_send):
def handle_read(self):
data = self.recv(8192)
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))
# 監(jiān)聽(tīng)連接參數(shù)指定排隊(duì)的最大連接數(shù)和應(yīng)至少為1; 最大值取決于系統(tǒng)(通常為5)。
self.listen(5)
'''
當(dāng)與發(fā)起對(duì)本地端點(diǎn)的 connect() 調(diào)用的新遠(yuǎn)程端點(diǎn)已建立連接時(shí)會(huì)在偵聽(tīng)通道(被動(dòng)打開(kāi)方)上被調(diào)用。
sock 是可被用于在連接上發(fā)送和接收數(shù)據(jù)的 新建 套接字對(duì)象,
而 addr 是綁定到連接另一端的套接字的地址。
'''
def handle_accept(self):
pair = self.accept()
if pair is not None:
sock, addr = pair
print('連接來(lái)自于 %s' % repr(addr))
# 連接成功后 給客戶端發(fā)送消息
handler = EchoHandler(sock)
handler.send('hello world'.encode('utf-8'))
if __name__ == '__main__':
server = EchoServer('127.0.0.1', 9000)
asyncore.loop()
運(yùn)行結(jié)果
服務(wù)端:

客戶端:

注意:
本文章使用python3.7版本,3.10版本已經(jīng)移除此模塊,之后可使用asyncio模塊。
至此結(jié)束,本文章只做了一個(gè)基本使用講解,可以查看借鑒使用,若想要做消息還差的很多。
到此這篇關(guān)于Python asyncore socket客戶端開(kāi)發(fā)基本使用的文章就介紹到這了,更多相關(guān)Python asyncore socket使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Python的Flask框架中構(gòu)建Web表單的教程
Flask框架中自帶一個(gè)Form表單類(lèi),通過(guò)它的子類(lèi)來(lái)實(shí)現(xiàn)表單將相當(dāng)愜意,這里就為大家?guī)?lái)Python的Flask框架中構(gòu)建Web表單的教程,需要的朋友可以參考下2016-06-06
簡(jiǎn)單幾步教你學(xué)會(huì)Python接口自動(dòng)化測(cè)試
這篇文章主要介紹了簡(jiǎn)單幾步教你學(xué)會(huì)Python接口自動(dòng)化測(cè)試,本文從一個(gè)簡(jiǎn)單的登錄接口測(cè)試入手,一步步調(diào)整優(yōu)化接口調(diào)用姿勢(shì),期望讀者可以通過(guò)本文對(duì)接口自動(dòng)化測(cè)試有一個(gè)大致的了解,需要的朋友可以參考下2023-08-08
Python虛擬環(huán)境的創(chuàng)建和使用詳解
這篇文章主要給大家介紹了關(guān)于Python虛擬環(huán)境的創(chuàng)建和使用的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
如何用Python和JS實(shí)現(xiàn)的Web SSH工具
這篇文章主要介紹了如何用Python和JS實(shí)現(xiàn)的Web SSH工具,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02

