[英]Why does Python lock the port? And can this be safely used for simple proof of concept live app
這是有趣的。 我做了一個簡單的腳本來綁定和服務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] 地址已在使用中
如果我殺死前一個進程,為什么會這樣?
此外,除了不能將其用作IP 的測試服務器的簡單測試 webapp 之外,是否還有其他原因:port/somesamplewebapp - 他們說“不建議將 http.server 用於生產。它僅實現基本安全性檢查。” 但如果它不需要 https 或額外的安全性......有什么風險?
默認情況下,操作系統會阻止不同 PID 重用地址。 您可以使用套接字選項SO_REUSEADDR
來解決這個問題。 但是,由於您使用的是 TCPServer class 並且它有自己的不同的指定方式。 您可以使用此代碼。
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.