最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python asyncore socket客戶端實(shí)現(xiàn)方法詳解

 更新時(shí)間:2022年12月22日 08:31:55   作者:JSON_L  
這篇文章主要介紹了Python asyncore socket客戶端實(shí)現(xiàn)方法,asyncore庫(kù)是python的一個(gè)標(biāo)準(zhǔn)庫(kù),提供了以異步的方式寫入套接字服務(wù)的客戶端和服務(wù)器的基礎(chǔ)結(jié)構(gòu)

介紹

asyncore庫(kù)是python的一個(gè)標(biāo)準(zhǔn)庫(kù),提供了以異步的方式寫入套接字服務(wù)的客戶端和服務(wù)器的基礎(chǔ)結(jié)構(gòu)。操作網(wǎng)絡(luò)的時(shí)候可以直接使用socket等底層的庫(kù),但是asyncore使得我們可以更加方便的操作網(wǎng)絡(luò),避免直接使用socket,select,poll等工具時(shí)需要面對(duì)的復(fù)雜情況。

1.定義類并且繼承 asyncore.dispatcher

class SocketClient(asyncore.dispatcher):

2.實(shí)現(xiàn)類中的回調(diào)代碼

調(diào)用父類方法

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ù)器。返回值為True表示可寫,F(xiàn)alse 表示不可寫。

如果不識(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ù)中編寫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ù)中編寫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):
    # 編寫處理錯(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客戶端實(shí)現(xiàn)方法詳解的文章就介紹到這了,更多相關(guān)Python asyncore socket內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

北辰区| 石柱| 新乡县| 邢台市| 光泽县| 民丰县| 武鸣县| 内丘县| 龙陵县| 巴南区| 凤城市| 华蓥市| 广南县| 娱乐| 江口县| 准格尔旗| 清新县| 弥勒县| 全州县| 本溪市| 昌黎县| 饶阳县| 永吉县| 台中县| 泽普县| 磐安县| 桐城市| 都安| 新野县| 健康| 肃北| 沂南县| 朝阳区| 屯留县| 连南| 张掖市| 苗栗市| 谢通门县| 开鲁县| 鹤岗市| 洪江市|