Python Asynchat State - PullRequest
       19

Python Asynchat State

0 голосов
/ 18 июля 2011

Я только начал работать с основами работы с сетями на сокете Python.Как упражнение в понимании, я пытался хэшировать базовый сервер, который будет запрашивать у его клиента тип файла, а после получения строки расширения запрашивать фактический файл.Я нашел в Интернете множество учебных пособий, в которых используется библиотека asyncore, в частности asynchat, для настройки такого рода функций вызова и ответа.

Самый базовый, за которым я следовал, можно найти здесь (я его скопировал)

http://effbot.org/librarybook/asynchat.htm

<code>import asyncore, asynchat
import os, socket, string

PORT = 8000

class HTTPChannel(asynchat.async_chat):

    def __init__(self, server, sock, addr):
        asynchat.async_chat.__init__(self, sock)
        self.set_terminator("\r\n")
        self.request = None
        self.data = ""
        self.shutdown = 0

    def collect_incoming_data(self, data):
        self.data = self.data + data

    def found_terminator(self):
        if not self.request:
            # got the request line
            self.request = string.split(self.data, None, 2)
            if len(self.request) != 3:
                self.shutdown = 1
            else:
                self.push("HTTP/1.0 200 OK\r\n")
                self.push("Content-type: text/html\r\n")
                self.push("\r\n")
            self.data = self.data + "\r\n"
            self.set_terminator("\r\n\r\n") # look for end of headers
        else:
            # return payload.
            self.push("<html><body><pre>\r\n")
            self.push(self.data)
            self.push("
\ r \n ") self.close_when_done () класс HTTPServer (asyncore.dispatcher): def __init __ (self, port): asyncore.dispatcher .__ init __ (self) self.create_socket (socket.AF_INET, socket.SOCK_STREAM) self.bind (" (", порт)) self.listen (5) def handle_accept (self): conn, addr = self.accept () HTTPChannel (self, conn, addr) # # попробовать s = HTTPServer (PORT) print" обслуживающий порт", PORT," ... "

Мой вопрос связан с методом handle_accept класса HTTPServer. Если каждый раз, когда поступает запрос, объект HTTPChannelинициализировано, не было бы невозможно в такой настройке создать вызов и ответ? Я думал, что можно установить флаги для _hastype и _hasfile в канальном объекте, но, так как accept инициирует его для каждого отдельного соединениясостояние объекта забывается при каждом отдельном запросе. Я понимаю, что эта настройка должна быть базовой HTTPServэ, но мой вопрос, как я могу отредактировать его, чтобы настроить что-то вроде того, что я описал?Нужно ли объекту сервера наследовать asynchat и полностью отказаться от диспетчера?Канальный объект должен иметь какое-то состояние, чтобы знать, что тип файла уже был отправлен, а затем запросить двоичный файл этого файла.Мне очень любопытно узнать, как могла бы выглядеть самая чистая из возможных реализаций этого.

Огромное спасибо - я очень плохо знаком с сокетами.Пожалуйста, дайте мне знать, если я не был ясен.

1 Ответ

1 голос
/ 18 июля 2011

Обычно соединение остается открытым после его первоначального создания, поэтому все части сообщения от одного и того же клиента переходят к одному и тому же объекту HTTPChannel - accept вызывается только при создании нового соединения.

...