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