python asynchat:如何存储有关各个连接的信息,以及如何知道客户端何时断开连接

时间:2011-07-25 15:21:10

标签: python irc asyncore

为了好玩,我正在用asynchat写一个最小的IRC服务器。我正在尝试清理一些基础知识(我的具体问题遵循代码)。我决定不在Twisted中使用任何东西,所以我可以自己实现更多。首先,我的代码:

import asyncore,asynchat
import socket

class Connection(asynchat.async_chat):
    def __init__(self, server, sock, addr):
        asynchat.async_chat.__init__(self, sock)
        self.set_terminator('\n')
        self.data = ""
        print "client connecting:",addr
        # do some IRC protocol initialization stuff here

    def collect_incoming_data(self, data):
        self.data = self.data + data

    def found_terminator(self):
        print self.data
        self.data = ''

class Server(asyncore.dispatcher):
    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.bind((host, port))
        self.listen(5)

    def handle_accept(self):
        conn, addr = self.accept()
        Connection(self, conn, addr)

    def handle_close(self):
        self.close()

s = Server('127.0.0.1',5006)
asyncore.loop()

因此,在我看来,这个代码结构类似于Twisted客户端工厂:Server类初始化一次,并且每次客户端连接时基本上实例化Connection。第一个问题:通过将所有连接存储在Server内的列表中,是跟踪所有连接客户端的最佳方法吗?

此外,我不明白我是如何知道特定客户端何时关闭其与套接字的连接? Connection实现了asynchat(以及扩展名asyncore),但是当客户端断开连接时,不会触发Connection类的handle_close()回调。它似乎仅适用于服务器上的绑定套接字被销毁的情况。我没有看到任何方法用于此目的。无论客户端是否连接,此套接字始终保持打开状态,对吧?

1 个答案:

答案 0 :(得分:0)

处理客户端关闭连接检查handle_error方法,您的客户端是否发出干净的关闭连接? handle_error():在引发异常时调用,否则不进行处理。默认版本打印精简回溯。

希望它有所帮助。