请稍候,加载中....

asynchat模块

如需使用asynchat模块需要继承该模块的async_chat类,并实现两个方法:collect_incoming_data()fount_terminator()

导入async_chat类

from asynchat import async_chat

async_chat类继承自asyncore.dispatcher类

async_chat类的实例化

a = async_chat([sock])

async_chat类实例a方法

实例a除了具有继承自asyncore.dispatcher类的方法以外,还具有以下方法:

方法名 说明
close_when_done() 将None推入生成函数FIEO对列中,表示输出数据流已经到达文件结尾。写入程序收到此信号关闭通道
collect_incoming_data(data) 收到此数据时调用该方法。data是收到的数据,必须实现该方法
discard_buffers() 丢弃输入/输出缓冲区与生产者FIFO队列中所有保存的数据
found_terminator() set_terminator()设置终止状态时调用此方法。该方法必须由用户实现,该方法必须实现。
get_terminator() 返回通道的终止符
push(data) 将数据data加入到输出生产者的FIFO队列,data为发送字符串
push_with_producer(producer) 将生产者producer加入到生产者FIFO队列
set_terminator(term) 在通道上设置终止状态。term可以是字符串类型,整数或者None
simple_producer(data[,byffer_size]) 创建简单的生产者对象,从字节字符串data生成数据块。buffer_size指定数据块的大小,默认512

Asynchat示例

asynchat与asyncore总是一起使用,asyncore用于处理连接,asynchat用于处理各个连接

示例

# 处理新的accept
class async_http(asyncore.dispatcher):
    def __init__(self, port):
        super().__init__()
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.bind(("", port))
        self.listen(5)
        
    def handle_accept(self):
        client, addr = self.accept()
        return async_http_handle(client)


# 每个连接处理
# 继承async_chat类
class async_http_handle(asynchat.async_chat):
    def __init__(self, conn=None):
        super().__init__(conn)
        self.data = []
        self.got_header = False
        self.set_terminator('\r\n\r\n')
    
    def collect_incoming_data(self, data):
        if not self.got_header:
            self.data.append(data)

...

 


Python学习手册-