Python中检测浏览器关闭以关闭Web服务器

172 阅读2分钟

如何使用Python脚本生成网页时,在浏览器关闭后关闭相应的web服务器?在Python中,使用脚本生成网页时,用户需要一个web服务器来测试网页。通常的做法是创建一个按钮,用户点击或按F5来启动服务器并打开浏览器到该页面。然而,服务器一旦启动,它将永远运行,直到用户手动关闭它。问题是如何在浏览器关闭后自动关闭服务器?

huake_00198_.jpg 2. 解决方案 有两种解决方案:

  • 第一种解决方案是使用JavaScript检测浏览器是否关闭,然后向服务器发送一个请求来关闭它。
  • 第二种解决方案是让服务器在两个不同的端口上监听,一个端口用于主服务器,另一个端口用于管理服务器。当管理服务器接收到任何请求时,它将关闭主服务器。

以下是使用第一种解决方案的代码示例:

import sys
import webbrowser
from SimpleHTTPServer import SimpleHTTPRequestHandler as HandlerClass
from BaseHTTPServer import HTTPServer as ServerClass

Protocol = 'HTTP/1.0'
port = 8080
ip = '127.0.0.1'

new = 2  # goes to new tab
url = "http://"+ip+":{0}".format(port)

serverAddress = (ip,port)
HandlerClass.protocol = Protocol
httpd = ServerClass(serverAddress, HandlerClass)

sa = httpd.socket.getsockname()
webbrowser.open(url,new=new)
httpd.serve_forever()

在上面的代码中,我们定义了用于处理HTTP请求的HandlerClass和用于启动和停止服务器的ServerClass。然后,我们创建一个服务器对象,并指定服务器地址和端口。我们还打开浏览器并导航到服务器正在侦听的URL。最后,我们调用serve_forever()方法来启动服务器。

以下是使用第二种解决方案的代码示例:

import sys
from threading import Thread
import webbrowser
import BaseHTTPServer
import SimpleHTTPServer

serverClass=BaseHTTPServer.HTTPServer
handlerClass=SimpleHTTPServer.SimpleHTTPRequestHandler

Protocol = "HTTP/1.0"
port = 8080
ip = '127.0.0.1'
admIp = ip
admPort = 8081

new = 2 #2 goes to new tab, 0 same and 1 window.
url = "http://"+ip+":{0}".format(port)

handlerClass.protocol = Protocol
httpdGame = serverClass((ip,port), handlerClass)
httpdAdm = serverClass((admIp,admPort), handlerClass) 

sa = httpdGame.socket.getsockname()
sb = httpdAdm.socket.getsockname()
print("\n---\nServing HTTP on {0}, port {1}\n---\n".format(sa[0],sa[1]) )
print("\n---\nAdm HTTP listening on {0}, port {1}\n---\n".format(sb[0],sb[1]) )
browserOk = webbrowser.open(url,new=new)

def runGameServer():
    httpdGame.serve_forever()
    print("\nrunGameServer stopped\n")
    httpdAdm.shutdown()
    return

def runAdmServer():
    httpdAdm.handle_request()
    httpdGame.shutdown()
    print("\nrunAdmServer stopped\n")
    return

gameServerThread = Thread(target=runGameServer)
gameServerThread.daemon = True
admServerThread = Thread(target=runAdmServer)

gameServerThread.start()
admServerThread.start()
admServerThread.join()

在上面的代码中,我们定义了用于处理HTTP请求的HandlerClass和用于启动和停止服务器的ServerClass。然后,我们创建两个服务器对象,一个用于主服务器,另一个用于管理服务器。我们还打开浏览器并导航到主服务器正在侦听的URL。最后,我们启动两个服务器线程,并等待管理服务器线程完成。 当管理服务器接收到任何请求时,它将关闭主服务器。