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

客戶端:

注意:
本文章使用python3.7版本,3.10版本已經(jīng)移除此模塊,之后可使用asyncio模塊。
至此結束,本文章只做了一個基本使用講解,可以查看借鑒使用,若想要做消息還差的很多。
到此這篇關于Python asyncore socket客戶端開發(fā)基本使用的文章就介紹到這了,更多相關Python asyncore socket使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python編程實現(xiàn)數(shù)學運算求一元二次方程的實根算法示例
這篇文章主要介紹了Python編程實現(xiàn)數(shù)學運算求一元二次方程的實根算法,涉及Python數(shù)學運算求解方程的相關實現(xiàn)技巧,需要的朋友可以參考下2017-04-04
Python多任務版靜態(tài)Web服務器實現(xiàn)示例
這篇文章主要為大家介紹了Python靜態(tài)Web服務器多任務版實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
Flask框架使用DBUtils模塊連接數(shù)據(jù)庫操作示例
這篇文章主要介紹了Flask框架使用DBUtils模塊連接數(shù)據(jù)庫操作,結合實例形式較為詳細的分析了flask框架使用DBUtils模塊連接數(shù)據(jù)庫的常見操作技巧與相關注意事項,需要的朋友可以參考下2018-07-07
Windows10下Tensorflow2.0 安裝及環(huán)境配置教程(圖文)
這篇文章主要介紹了Windows10下Tensorflow2.0 安裝及環(huán)境配置教程(圖文),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11
jupyter notebook中新建cell的方法與快捷鍵操作
這篇文章主要介紹了jupyter notebook中新建cell的方法與快捷鍵操作,具有很好的參考價值,希望對有所幫助。一起跟隨小編過來看看吧2020-04-04
解決pip安裝tensorflow中出現(xiàn)的no module named tensorflow.python 問題方法
這篇文章主要介紹了解決pip安裝tensorflow中出現(xiàn)的no module named tensorflow.python 問題方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02

