Python TCPServer与HTTPServer

Python TCPServer与HTTPServer,python,httpserver,tcpserver,Python,Httpserver,Tcpserver,我正在编写一个简单的python3 Web服务器。我尝试过各种教程,都做得很好。然而,有一点我不明白 在一个教程中,他们使用HTTPServer的方式如下: server = HTTPServer(('', PORT_NUMBER), myHandler) server.serve_forever() with socketserver.TCPServer(('', PORT_NUMBER), myHandler) as httpd: httpd.serve_forever() 在

我正在编写一个简单的python3 Web服务器。我尝试过各种教程,都做得很好。然而,有一点我不明白

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

server = HTTPServer(('', PORT_NUMBER), myHandler) 
server.serve_forever()
with socketserver.TCPServer(('', PORT_NUMBER), myHandler) as httpd:
    httpd.serve_forever()
在另一个教程中,他们使用socketserver.TCPServer,如下所示:

server = HTTPServer(('', PORT_NUMBER), myHandler) 
server.serve_forever()
with socketserver.TCPServer(('', PORT_NUMBER), myHandler) as httpd:
    httpd.serve_forever()
这两种方法的区别是什么?我只需要一个简单的Web服务器,它能够通过POST接收JSON文件,并使用另一个JSON接收aswer。在这两种情况下,我将使用相同的处理程序:

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'}")
其中一种方法更适合我的需要吗?是否有更好的方法编写此服务器以满足我的需要?


谢谢你的帮助和时间

TCP是一种OSI第4层传输协议,而HTTP是一种建立在TCP之上的更高的第7层应用协议

事实上,根据以下说明,它看起来像是直接从
socketserver.TCPServer
继承的:

一个类HTTPServer是socketserver.TCPServer子类。信息技术 创建并侦听HTTP套接字,将请求分派到 处理程序

例如,TCP将负责建立连接(与
SYN
SYN-ACK
ACK
)的三方握手),但它实际上并没有在数据交互(请求/响应)的结构方面做太多规定。如果使用TCP协议,通常需要编写所有自己的数据处理代码

我所需要的只是一个能够接收JSON文件的简单Web服务器 通过POST和aswer与另一个JSON

这表明HTTP服务器更适合您的需要,因为
POST
的概念,并且您对另一个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()
服务器实例化工作的一种常见模式似乎是

  • 要实例化较低级别的协议服务器(即TCP)并传入较高级别的处理程序(如
    http.server.SimpleHTTPRequestHandler
    ),因此需要
    socketserver.TCPServer((“”,PORT),myhandler)
  • 要在上下文管理器中使用它(
    关键字),很可能是因为您需要在服务器完成执行后拆除/释放资源

  • TCPServer
    更为通用,它可以用于任何TCP协议,您必须自己编写应用程序代码
    HTTPServer
    特定于HTTP协议。