TCPServer 与 HTTPServer

我正在编写一个简单的 python3 网络服务器。我尝试了各种教程,一切都很好。尽管如此,还是有一个我不明白的区别。


在一个教程中,他们使用 HTTPServer 如下:


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

server.serve_forever()

在另一个教程中,他们使用 socketserver.TCPServer 如下:


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

    httpd.serve_forever()

两种方法有什么区别?我所需要的只是一个简单的网络服务器,它能够通过 POST 接收 JSON 文件并使用另一个 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'}")

其中一种方法是否更适合我的需求?有没有更好的方法来编写这个服务器以满足我的需要?


感谢您的帮助和时间!


翻翻过去那场雪
浏览 520回答 1
1回答

至尊宝的传说

TCP 是OSI 第 4 层传输协议,而 HTTP 是更高的第 7 层应用程序协议,建立在 TCP 之上。实际上,根据文档HTTPServer,它看起来像直接继承自:socketserver.TCPServer一个类 HTTPServer 是 socketserver.TCPServer 的子类。它创建并侦听 HTTP 套接字,将请求分派给处理程序。例如,TCP 将负责建立连接(与SYN、SYN-ACK和的三次握手ACK),但它并没有真正规定数据交互(请求/响应)的结构。如果您使用 TCP 协议,您通常需要编写所有自己的数据处理代码。我只需要一个简单的网络服务器,它能够通过 POST 接收 JSON 文件并使用另一个 JSON这表明 HTTP 服务器在这里更适合您的需求,因为 a 的概念POST,并且您对 an 的描述answer with another JSON可能会包含响应(带有响应正文、响应标头和响应状态)。所有这些都是 HTTP 概念。作为http.server. BaseHTTPRequestHandler状态的文档,它将包含一个名为的实例变量command,即您的请求方法(GET例如)。我无法确切说明myhandler在您的示例代码中是如何分配的,但是查看其他一些文档示例,它看起来像http.server.SimpleHTTPRequestHandler:import http.serverimport socketserverPORT = 8000Handler = http.server.SimpleHTTPRequestHandlerwith socketserver.TCPServer(("", PORT), Handler) as httpd:    print("serving at port", PORT)    httpd.serve_forever()服务器实例化工作的常见模式似乎是实例化一个较低级别的协议服务器(即 TCP)并传入较高级别的处理程序(如http.server.SimpleHTTPRequestHandler),因此socketserver.TCPServer(("", PORT), myhandler).要在上下文管理器(with关键字)中使用它,很可能是因为您需要在服务器完成执行后拆除/释放资源。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python