0

这是有趣的。我做了一个简单的脚本来绑定和服务http,但我没有在 Python3 中做到这一点。我可以写一个简单的服务器:

import http.server
import socketserver

PORT = 8002

Handler = http.server.SimpleHTTPRequestHandler
#https://docs.python.org/3/library/http.server.html
class MyHandler(http.server.SimpleHTTPRequestHandler):
    def __init__(self, request, client_addr, server):
        super().__init__(request, client_addr, server)
    def do_GET(self, ):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.wfile.write('Hey!'.encode())

httpd = socketserver.TCPServer(("0.0.0.0", PORT), MyHandler)

print("serving at port", PORT)
httpd.serve_forever()

但是当我运行它时,然后 Ctrl+c,然后再次运行它,它说:

OSError: [Errno 98] 地址已在使用中

如果我杀死前一个进程,为什么会这样?

此外,除了不能将其用作简单的测试 web 应用程序之外,还有什么原因可以在IP :port/somesamplewebapp 上的测试服务器上使用 - 他们说“不建议将 http.server 用于生产。它只实现基本的安全性检查。” 但如果它不需要 https 或额外的安全性......有什么风险?

4

1 回答 1

0

默认情况下,操作系统会阻止不同 PID 重用地址。你可以用 socket 选项打败它SO_REUSEADDR。但是,由于您使用的是 TCPServer 类,并且它有自己的、不同的指定方式。您可以使用此代码。


import http.server
import socketserver

PORT = 8002

Handler = http.server.SimpleHTTPRequestHandler

#https://docs.python.org/3/library/http.server.html

class MyHandler(http.server.SimpleHTTPRequestHandler):
    def __init__(self, request, client_addr, server):
        super().__init__(request, client_addr, server)

    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.wfile.write('Hey!'.encode())


class MyServer(socketserver.TCPServer):
    allow_reuse_address = True  # <-- This is what you need


httpd = MyServer(("0.0.0.0", PORT), MyHandler)

print("serving at port", PORT)

httpd.serve_forever()
于 2020-04-11T08:16:27.410 回答