为了好玩,我正在用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()回调不会触发。它似乎只适用于服务器上绑定的套接字被破坏时。我看不出有什么方法可以达到这个目的。不管客户机是否连接,这个套接字总是打开的,对吗?在
要处理客户端关闭的连接,请检查handle\u error方法,您的客户端是否发出干净的关闭连接? handle_error():在引发异常而不进行其他处理时调用。默认版本打印压缩的回溯。在
希望有帮助。在
相关问题 更多 >
编程相关推荐