如需使用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)
...
讨论区