首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCPServer对HTTPServer

TCPServer对HTTPServer
EN

Stack Overflow用户
提问于 2019-09-22 01:43:17
回答 1查看 1.4K关注 0票数 5

我正在编写一个简单的python3 webserver服务器。我已经尝试过各种教程,而且都工作得很好。然而,有一个区别,我不明白。

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

代码语言:javascript
复制
server = HTTPServer(('', PORT_NUMBER), myHandler) 
server.serve_forever()

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

代码语言:javascript
复制
with socketserver.TCPServer(('', PORT_NUMBER), myHandler) as httpd:
    httpd.serve_forever()

,这两种方法之间有什么区别呢?我所需要的只是一个简单的服务器,它能够通过POST接收JSON文件,并使用另一个JSON。在这两种情况下,我都会使用相同的处理程序:

代码语言:javascript
复制
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'}")

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

谢谢你的帮助和时间!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-22 02:19:55

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

事实上,根据HTTPServer文档,它看起来像是直接从socketserver.TCPServer继承的

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

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

我所需要的只是一个简单的with服务器,它能够通过POST接收JSON文件,并与另一个JSON一起使用

这表明HTTP服务器更适合您在这里的需要,因为POST的概念,并且您对answer with another JSON的描述可能包括响应(带有响应主体、响应头和响应状态)。所有这些都是HTTP概念。作为http.server. BaseHTTPRequestHandler的文档,它将包含一个名为command的实例变量,它是您的请求方法(例如,GET)。

我不清楚在示例代码中如何分配myhandler,但是看看其他一些文档示例,它看起来就像一个http.server.SimpleHTTPRequestHandler

代码语言:javascript
复制
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. 实例化低级协议服务器(即。并传入一个更高级别的处理程序(如http.server.SimpleHTTPRequestHandler),从而获得socketserver.TCPServer(("", PORT), myhandler)
  2. 要在上下文管理器(with关键字)中使用它,很可能是因为您需要在服务器完成执行后删除/释放资源。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58045415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档