Ради интереса я пишу минимальный IRC-сервер с asynchat. Я пытаюсь прояснить некоторые основы (мои конкретные вопросы следуют за кодом). Я решил не использовать что-либо в 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()
Итак, на мой взгляд, эта структура кода похожа на фабрику витых клиентов: класс Server
инициализируется один раз и в основном создает экземпляр Connection
при каждом подключении клиента. Первый вопрос: является ли лучший способ отслеживать все подключенные клиенты, сохраняя все подключения в списке в Server
?
Кроме того, я не понимаю, как мне узнать, когда конкретный клиент закрывает свое соединение с моим сокетом? Connection
реализует asynchat (и расширением asyncore), но добавление обратного вызова handle_close () в класс Connection
не срабатывает, когда клиент отключается. Кажется, это только для того, когда связанный сокет на сервере разрушен. Я не вижу никаких методов для этой цели. Этот сокет всегда остается открытым, независимо от того, подключаются клиенты или нет, верно?