Python异步通信模块asyncore解读

 更新时间:2023年11月10日 08:54:59   作者:kongxx  
这篇文章主要介绍了Python异步通信模块asyncore的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Python异步通信模块asyncore

Python的asyncore模块提供了以异步的方式写入套接字服务的客户端和服务器的基础结构。

模块主要包括

  • asyncore.loop(…) - 用于循环监听网络事件。loop()函数负责检测一个字典,字典中保存dispatcher的实例。
  • asyncore.dispatcher类 - 一个底层套接字对象的简单封装。这个类有少数由异步循环调用的,用来事件处理的函数。
  • dispatcher类中的writable()和readable()在检测到一个socket可以写入或者数据到达的时候被调用,并返回一个bool值,决定是否调用handle_read或者handle_write。
  • asyncore.dispatcher_with_send类 - 一个 dispatcher的子类,添加了简单的缓冲输出能力,对简单的客户端很有用。

例子

下面看一个简单的例子

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 - 响应服务器端程序,负责监听一个端口,并响应客户端发送的消息然后原样返回给客户端。

其中handle_accept()方法定义当一个连接到来的时候要执行的操作,这里指定了使用一个Handler来出来发送来的数据。

EchoHandler - 服务器端数据响应类,接收数据并把数据原样发回。

EchoClient - 响应服务客户端程序,负责连接响应服务器。其中

  • messages - 定义了一个要发送的消息列表,每次发送一个消息,知道列表为空为止。
  • handle_read() - 处理接收到的数据,这里把收到的数据打印的终端上。
  • writable() - 判断是否有数据可以向服务器端发送。
  • handle_write() - 当writable()函数返回True时,写入数据。

EchoServerThread - 用来启动服务器端程序的线程。

EchoClientThread - 用来启动客户端端程序的线程。

测试

运行上面的测试代码,可以看到服务器和客户端建立了连接后,响应了客户端发送来的10个数字,然后关闭了连接。

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python手机号前7位归属地爬虫代码实例

    python手机号前7位归属地爬虫代码实例

    这篇文章主要介绍了python手机号前7位归属地爬虫代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python能干什么、Python主要应用于哪些方面

    Python能干什么、Python主要应用于哪些方面

    无论是从入门级选手到专业级选手都在做的爬虫,还是Web程序开发、桌面程序开发还是科学计算、图像处理, Python都可以胜任。Python为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、 数据库、文本等大量内容。用Python开发,许多功能不必从零编写
    2023-06-06
  • python中快速进行多个字符替换的方法小结

    python中快速进行多个字符替换的方法小结

    最近在用python给自己的seo工作提高效率和节省时间,发现python真的很不错,可以完成很多事情。多个字符替换是大家可能都会遇到的一个问题,昨天在工作中就碰到了这么一个问题,所以想着记录一下解决方案及其过程,方便以后参考。下面来一起看看吧。
    2016-12-12
  • Matplotlib自定义图例(多张图共享一个图例)

    Matplotlib自定义图例(多张图共享一个图例)

    最近再用Matplotlib绘图,需要做两个子图都不需要设置图例,图例单独用一个figure来显示,本文就详细的来介绍一下,感兴趣的可以了解一下
    2023-08-08
  • python多进程程序打包成exe的问题

    python多进程程序打包成exe的问题

    这篇文章主要介绍了python多进程程序打包成exe的问题的相关资料,需要的朋友可以参考下
    2022-12-12
  • python正则爬取某段子网站前20页段子(request库)过程解析

    python正则爬取某段子网站前20页段子(request库)过程解析

    这篇文章主要介绍了python正则爬取某段子网站前20页段子(request库)过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 基于Python编写一个桌面时钟屏保

    基于Python编写一个桌面时钟屏保

    这篇文章主要为大家详细介绍了如何基于Python编写一个桌面时钟屏保效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • python datetime模块详解

    python datetime模块详解

    Python中常用于时间的模块有time、datetime 和 calendar,顾名思义 time 是表示时间(时、分、秒、毫秒)等,calendar 是表示日历时间的,本章先讨论 datetime 模块,需要的朋友可以参考下
    2022-06-06
  • 如何将python代码生成API接口

    如何将python代码生成API接口

    这篇文章主要介绍了如何将python代码生成API接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • pytorch教程之网络的构建流程笔记

    pytorch教程之网络的构建流程笔记

    这篇文章主要介绍了pytorch教程中网络的构建流程,文中附含了详细的示例代码流程,有需要的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09

最新评论