如何运行本地服务器并从同一个python程序打开URL?

时间:2016-12-22 03:58:16

标签: python server localhost

我想启动本地服务器,然后使用同一个python程序中的浏览器打开一个链接。

这就是我的尝试(一种非常幼稚和愚蠢的尝试):

InputStream is1 = con1.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is1);
byte[] buffer = new byte[2048]; // or whatever size you want
int n;
OutputStream os = new FileOutputStream("test.doc");
while ((n = bis.read(buffer)) >= 0) {
    os.write(buffer, 0, n);
}
os.close();
bis.close();

但是,程序不会转到第二个语句,因为服务器仍在后台运行。要打开浏览器,我需要退出服务器,这会破坏运行服务器的目的。

任何人都可以建议一个有效的解决方案来帮助我吗?

1 个答案:

答案 0 :(得分:1)

您可以在守护程序线程中启动Web服务器(如果只剩下守护程序线程,则退出Python程序),然后从主线程发出请求。

唯一的问题是将主线程同步到服务器线程,因为HTTP服务器需要一些时间来启动,并且在此之前不会处理任何请求。我不知道一个简单而干净的解决方案,但你可以(有点hackish)暂停主线程数秒(可能更短)并在此之后开始发出请求。另一种选择是从一开始就向Web服务器发送请求,并期望它们在一段时间内失败。

这是一个小型示例脚本,其中包含一个简单的HTTP Web服务器,它通过localhost:8080上的TCP提供来自本地文件系统的内容,以及一个示例请求,从Web服务器的目录中请求文件foo.txt(和在这种情况下,脚本也开始了。

import sys
import requests
import threading
import time

from BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler

# set up the HTTP server and start it in a separate daemon thread
httpd = HTTPServer(('localhost', 8080), SimpleHTTPRequestHandler)
thread = threading.Thread(target=httpd.serve_forever)
thread.daemon = True

# if startup time is too long we might want to be able to quit the program
try:
    thread.start()
except KeyboardInterrupt:
    httpd.shutdown()
    sys.exit(0)

# wait until the webserver finished starting up (maybe wait longer or shorter...)
time.sleep(5)

# start sending requests
r = requests.get('http://localhost:8080/foo.txt')

print r.status_code
# => 200 (hopefully...)