码迷,mamicode.com
首页 > 编程语言 > 详细

Python异步通信模块asyncore

时间:2017-07-30 12:45:04      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:缓冲   param   each   add   run   hid   ada   封装   数据   

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

标签:缓冲   param   each   add   run   hid   ada   封装   数据   

原文地址:http://www.cnblogs.com/gccbuaa/p/7258623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!