为了好玩,我正在用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()回调。它似乎仅适用于服务器上的绑定套接字被销毁的情况。我没有看到任何方法用于此目的。无论客户端是否连接,此套接字始终保持打开状态,对吧?
答案 0 :(得分:0)
处理客户端关闭连接检查handle_error方法,您的客户端是否发出干净的关闭连接? handle_error():在引发异常时调用,否则不进行处理。默认版本打印精简回溯。
希望它有所帮助。