为了账号安全,请及时绑定邮箱和手机立即绑定

TCPServer 与 HTTPServer

TCPServer 与 HTTPServer

翻翻过去那场雪 2022-06-02 16:33:43
我正在编写一个简单的 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'}")其中一种方法是否更适合我的需求?有没有更好的方法来编写这个服务器以满足我的需要?感谢您的帮助和时间!
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

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

实际上,根据文档HTTPServer,它看起来像直接继承自:socketserver.TCPServer

一个类 HTTPServer 是 socketserver.TCPServer 的子类。它创建并侦听 HTTP 套接字,将请求分派给处理程序。

例如,TCP 将负责建立连接(与SYNSYN-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.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关键字)中使用它,很可能是因为您需要在服务器完成执行后拆除/释放资源。


查看完整回答
反对 回复 2022-06-02
  • 1 回答
  • 0 关注
  • 519 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号