我正在编写一个简单的 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 将负责建立连接(与 SYN
、 SYN-ACK
和 ACK
的三向握手),但它并没有真正规定数据交互(请求/响应)的结构。如果您使用 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()
服务器实例化工作的常见模式似乎是
http.server.SimpleHTTPRequestHandler
),因此是 socketserver.TCPServer(("", PORT), myhandler)
。 with
关键字)中使用它,很可能是因为您需要在服务器完成执行后拆除/释放资源。 关于python - TCPServer 与 HTTPServer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58045415/