我正在编写一个简单的 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'}")

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

感谢您的帮助和时间!

最佳答案

TCP 是 OSI 第 4 层传输协议(protocol) ,而 HTTP 是 更高的第 7 层应用协议(protocol) ,构建在 TCP 之上。

事实上,根据 documentation ,看起来 HTTPServer 直接继承自 socketserver.TCPServer :



例如,TCP 将负责建立连接(与 SYNSYN-ACKACK 的三向握手),但它并没有真正规定数据交互(请求/响应)的结构。如果您使用 TCP 协议(protocol),您通常需要编写自己的所有数据处理代码。



这表明 HTTP 服务器更适合您的需求,因为 POST 的概念,并且您对 answer with another JSON 的描述可能会包含响应(带有响应正文、响应 header 和响应状态)。所有这些都将是 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()

服务器实例化工作的常见模式似乎是
  • 实例化较低级别的协议(protocol)服务器(即 TCP)并传入较高级别的处理程序(如 http.server.SimpleHTTPRequestHandler ),因此是 socketserver.TCPServer(("", PORT), myhandler)
  • 在上下文管理器(with 关键字)中使用它,很可能是因为您需要在服务器完成执行后拆除/释放资源。
  • 关于python - TCPServer 与 HTTPServer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58045415/

    10-10 18:05