Python异步通信模块asyncore

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python异步通信模块asyncore相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

python 实现聊天室

Python asyncore socket客户端开发基本使用

Python异步套接字recv不起作用

进程间通信和网络

Python聊天室

聊天服务器