TCPServer против HTTPServer - PullRequest
       31

TCPServer против HTTPServer

3 голосов
/ 22 сентября 2019

Я пишу простой веб-сервер python3.Я пробовал различные уроки, и все они работают довольно хорошо.Тем не менее, есть разница, которую я не понимаю.

В одном уроке они используют HTTPServer следующим образом:

server = HTTPServer(('', PORT_NUMBER), myHandler) 
server.serve_forever()

В другом уроке они используют socketserver.TCPServer следующим образом:

with socketserver.TCPServer(('', PORT_NUMBER), myHandler) as httpd:
    httpd.serve_forever()

В чем разница между обоими методами? Все, что мне нужно, - это простой веб-сервер, который может получать файлы JSON через POST и получать ответ с другим JSON.В обоих случаях я бы использовал один и тот же обработчик:

class myHandler(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()

    def do_GET(self):
        self._set_headers()
        self.wfile.write("{dummy:'dummy'}")

    def do_POST(self):
        # Doesn't do anything with posted data for this example
        self._set_headers()
        self.wfile.write("{dummy:'dummy'}")

Один из методов лучше соответствует моим потребностям?Есть ли еще лучший способ написания этого сервера для моих нужд?

Спасибо за вашу помощь и время!

1 Ответ

2 голосов
/ 22 сентября 2019

TCP - это транспортный протокол уровня 4 OSI , тогда как HTTP - это протокол приложения более высокого уровня 7 , построенный поверх TCP.

На самом деле, похоже, что HTTPServer наследуется напрямую от socketserver.TCPServer, в соответствии с документацией :

Один класс, HTTPServer, является сокет-серверомПодкласс .TCPServer.Он создает и прослушивает сокет HTTP, отправляя запросы обработчику.

Например, TCP позаботится об установлении соединения (трехстороннее рукопожатие с SYN, SYN-ACKи ACK) но на самом деле это не очень много прописывает с точки зрения структуры взаимодействия данных (запрос / ответ).Если вы используете протокол TCP, вам, как правило, нужно написать весь свой собственный код обработки данных.

Все, что мне нужно, - это простой веб-сервер, который может принимать файлы JSON через POST и aswer с другимJSON

Это говорит о том, что HTTP-сервер здесь лучше подходит для ваших нужд, поскольку концепция POST и ваше описание answer with another JSON, вероятно, будут включать ответ (стело ответа, заголовки ответа и статус ответа).Все это будут концепции HTTP.Как указано в документации для http.server. BaseHTTPRequestHandler, она будет включать переменную экземпляра с именем command, которая является вашим методом запроса (например, GET).

Я не могу точно сказать, как выглядит myhandlerназначенный в вашем примере кода, но, глядя на некоторые другие примеры документации, он выглядит как http.server.SimpleHTTPRequestHandler:

import http.server
import socketserver

PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

Часто шаблон экземпляра работы для сервера выглядит как

  1. Для создания экземпляра сервера протокола более низкого уровня (например, TCP) и передачи обработчика более высокого уровня (например, http.server.SimpleHTTPRequestHandler), следовательно, socketserver.TCPServer(("", PORT), myhandler).
  2. Для использования его в диспетчере контекста.(with ключевое слово), скорее всего потому, что вам нужно разорвать / освободить ресурсы после того, как сервер завершит выполнение.
...