zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Office Web Apps安装部署(一)
    TFS 2012使用简介
    SharePoint 2013 内容部署功能简介
    SharePoint 自定义WebPart之间的连接
    循环滚动新闻列表-懒人图库
    SharePoint 2010 文档管理之过期归档工具
    SharePoint 2010 文档管理系列之文档搜索
    SharePoint 网站登录不上,3次输入用户名/密码白页、
    SharePoint 门户添加内网域名
    JavaScript异常处理和事件处理
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7258623.html
Copyright © 2011-2022 走看看