Python asynchat: как хранить информацию об отдельных соединениях и как узнать, когда клиент отключается - PullRequest
1 голос
/ 25 июля 2011

Ради интереса я пишу минимальный 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 не срабатывает, когда клиент отключается. Кажется, это только для того, когда связанный сокет на сервере разрушен. Я не вижу никаких методов для этой цели. Этот сокет всегда остается открытым, независимо от того, подключаются клиенты или нет, верно?

1 Ответ

0 голосов
/ 14 декабря 2011

для обработки закрытых соединений на стороне клиента проверьте метод handle_error, выдает ли ваш клиент чистое закрытое соединение? handle_error (): вызывается, когда возникает исключение и не обрабатывается иначе. Версия по умолчанию печатает сокращенную трассировку.

надеюсь, это поможет.

...