1. 程式人生 > >Python異步通信模塊asyncore

Python異步通信模塊asyncore

能力 list 負責 use func param 代碼 lan 操作

Python異步通信模塊asyncore

介紹

Python的asyncore模塊提供了以異步的方式寫入套接字服務的client和server的基礎結構。

模塊主要包含:

  • asyncore.loop(…) - 用於循環監聽網絡事件。loop()函數負責檢測一個字典。字典中保存dispatcher的實例。

  • asyncore.dispatcher類 - 一個底層套接字對象的簡單封裝。這個類有少數由異步循環調用的,用來事件處理的函數。

    • dispatcher類中的writable()和readable()在檢測到一個socket能夠寫入或者數據到達的時候被調用,並返回一個bool值,決定是否調用handle_read或者handle_write。

  • asyncore.dispatcher_with_send類 - 一個 dispatcher的子類,加入了簡單的緩沖輸出能力。對簡單的client非常實用。

樣例

以下看一個簡單的樣例

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 - 響應server端程序。負責監聽一個端口,並響應client發送的消息然後原樣返回給client。

    當中handle_accept()方法定義當一個連接到來的時候要執行的操作,這裏指定了使用一個Handler來出來發送來的數據。

  • EchoHandler - server端數據響應類,接收數據並把數據原樣發回。

  • EchoClient - 響應服務client程序,負責連接響應server。當中

    • messages - 定義了一個要發送的消息列表,每次發送一個消息。知道列表為空為止。

    • handle_read() - 處理接收到的數據。這裏把收到的數據打印的終端上。

    • writable() - 推斷是否有數據能夠向server端發送。

    • handle_write() - 當writable()函數返回True時,寫入數據。

  • EchoServerThread - 用來啟動server端程序的線程。

  • EchoClientThread - 用來啟動client端程序的線程。

測試

執行上面的測試代碼。能夠看到server和client建立了連接後,響應了client發送來的10個數字。然後關閉了連接。

Incoming connection from (‘127.0.0.1‘, 51424)
1
2
3
4
5
6
7
8
9
10

轉載請以鏈接形式標明本文地址
本文地址:http://blog.csdn.net/kongxx/article/details/51158775

Python異步通信模塊asyncore