簡體   English   中英

如何在BaseHTTPServer中手動關閉連接?

[英]How to manually close connection in BaseHTTPServer?

我有一個將請求發送到HTTP服務器的腳本。

HTTP服務器腳本(代碼段):

...

class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  def do_GET(sa):
    pdict = cgi.parse_header(sa.headers.getheader('referer'))
    q = pdict[0]
    q = urllib.unquote(q)

    if q == "enternetixplorer" # basically just ignore this, doesn't have to do with the question
      sa.wfile.write("blah blah blah")
      # now restart server
      httpd.server_close()
      python = sys.executable
      os.execl(python, python, * sys.argv)

...

發送回“等等等等”,但是連接似乎沒有關閉,並且我的腳本一直在等待,直到我中止服務器。 (我的想法是,在計算“ do_GET()”的最后一部分時,BaseHTTPServer會自動關閉連接,但是我通過重新啟動腳本來防止這種情況。)

如果我是對的,如何關閉連接? 如果沒有,那可能是什么問題?

編輯:服務器腳本必須重新啟動整個程序。

執行時:

os.execl(python, python, * sys.argv)

os.exec *的Python 文檔說:

這些功能都執行一個新程序,以替換當前進程。 他們不回來。 在Unix上,新的可執行文件已加載到當前進程中,並且將具有與調用方相同的進程ID。 錯誤將報告為OSError異常。

因此,當您調用該函數時, do_GET函數會掛起並且永遠不會返回,因此HTTP服務器永遠不會刷新HTTP消息的末尾。

我認為在您的情況下,最簡單的更改是在調用exec之前先調用os.fork ,然后僅在子進程中調用exec。 讓父進程從do_GET函數返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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