pythonasynchat:如何存储关于单个连接的信息,以及如何知道客户端何时断开连接

2024-05-18 06:59:49 发布

您现在位置:Python中文网/ 问答频道 /正文

为了好玩,我正在用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()回调不会触发。它似乎只适用于服务器上绑定的套接字被破坏时。我看不出有什么方法可以达到这个目的。不管客户机是否连接,这个套接字总是打开的,对吗?在


Tags: 代码selfclosedata客户机serverinitdef
1条回答
网友
1楼 · 发布于 2024-05-18 06:59:49

要处理客户端关闭的连接,请检查handle\u error方法,您的客户端是否发出干净的关闭连接? handle_error():在引发异常而不进行其他处理时调用。默认版本打印压缩的回溯。在

希望有帮助。在

相关问题 更多 >