Python HTTP服务器保持活动



如何使Python HTTP服务器实时连接(流式传输(到浏览器?(将图像更新到无穷大(就像树莓派的运动眼

class MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
def _set_response(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.send_header("Connection", "keep-alive")
self.send_header("keep-alive", "timeout=999999, max=99999")
self.end_headers()

def do_GET(self):
#self.send_response(204)
#self.end_headers()

if self.path == '/':
self.path = 'abc.jpg'
return http.server.SimpleHTTPRequestHandler.do_GET(self)
# Create an object of the above class
handler_object = MyHttpRequestHandler
PORT = 8000
my_server = socketserver.TCPServer(("", PORT), handler_object)
# Star the server
my_server.serve_forever()

继续写,如:

while True:
self.wfile.write(b"data")

然而,据我所知,如果不使用helper外部库,这不会让您进入eventstream/server发送的事件领域。

我遇到了同样的问题,然后我偶然发现(经过多次调试(需要发送换行符(rnnn(才能发送数据包:

import http.server
import time

class MyHttpRequestHandler(http.server.BaseHTTPRequestHandler):
value = 0
# One can also set protocol_version = 'HTTP/1.1' here
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.send_header("Connection", "keep-alive")
self.end_headers()
while True:
self.wfile.write(str(self.value).encode())
self.wfile.write(b'rn')  # Or nn, necessary to flush
self.value += 1
time.sleep(1)

PORT = 8000
my_server = http.server.HTTPServer(("", PORT), MyHttpRequestHandler)
# Start the server
my_server.serve_forever()

这使您能够使用http.server库发送服务器发送事件(SSE(或HTTP长轮询,甚至json/raw HTTP流。

正如代码中的注释所说,您还可以将协议版本设置为HTTP/1.1,以默认启用keepalive。如果这样做,则必须为每个发送的数据包指定内容长度,否则连接将永远不会终止。

最好将其与线程服务器相结合,以允许并发连接,并可能在套接字本身上设置保活。

最新更新