簡體   English   中英

為什么 Python 會鎖定端口? 這可以安全地用於簡單的概念驗證實時應用嗎

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM