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中的yield from语法快速学习

    python中的yield from语法快速学习

    在本篇文章里小编给大家整理的是一篇关于python中的yield from语法快速学习相关内容,有兴趣的朋友们可以参考下。
    2020-11-11
  • pytorch中Schedule与warmup_steps的用法说明

    pytorch中Schedule与warmup_steps的用法说明

    这篇文章主要介绍了pytorch中Schedule与warmup_steps的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python生成一个迭代器的实操方法

    Python生成一个迭代器的实操方法

    在本文里小编给大家分享了关于Python怎么生成一个迭代器的相关操作方法,有需要的朋友们可以学习参考下。
    2019-06-06
  • Opencv实现二维直方图的计算及绘制

    Opencv实现二维直方图的计算及绘制

    这篇博客将介绍如何使用Opencv进行二维直方图的计算及绘制,维直方图可以让我们对不同的像素密度有更好的了解,感兴趣的可以了解一下
    2021-07-07
  • Python人脸检测实战之疲劳检测

    Python人脸检测实战之疲劳检测

    本文主要介绍了实现疲劳检测:如果眼睛已经闭上了一段时间,我们会认为他们开始打瞌睡并发出警报来唤醒他们并引起他们的注意。感兴趣的朋友可以了解一下
    2021-12-12
  • Python中逗号转为空格的三种方法

    Python中逗号转为空格的三种方法

    本文介绍了Python中将逗号转换为空格的三种方法,包含使用replace函数、使用split函数、使用正则表达式,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Python中is和==的区别详解

    Python中is和==的区别详解

    这篇文章主要介绍了Python中is和==的区别详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • wxPython中文教程入门实例

    wxPython中文教程入门实例

    这篇文章主要为大家分享下python编程中有关wxPython的中文教程,分享一些wxPython入门实例,有需要的朋友参考下
    2014-06-06
  • PyCharm自动化测试的实现

    PyCharm自动化测试的实现

    本文主要介绍了PyCharm自动化测试的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Python制作当年第一款手机游戏-贪吃蛇游戏(练习)

    Python制作当年第一款手机游戏-贪吃蛇游戏(练习)

    这篇文章主要介绍了Python制作当年第一款手机游戏-贪吃蛇游戏,文章利用Python pygame做一个贪吃蛇的小游戏而且讲清楚每一段代码是用来干嘛的,需要的朋友可以参考一下
    2022-01-01

最新评论