files - python-m simplehttpserver 8000
¿Cómo escribo un servidor HTTP python para escuchar en múltiples puertos? (3)
Yo diría que enhebrar algo así de simple es exagerado. Es mejor utilizar alguna forma de programación asincrónica.
Aquí hay un ejemplo usando Twisted :
from twisted.internet import reactor
from twisted.web import resource, server
class MyResource(resource.Resource):
isLeaf = True
def render_GET(self, request):
return ''gotten''
site = server.Site(MyResource())
reactor.listenTCP(8000, site)
reactor.listenTCP(8001, site)
reactor.run()
También creo que parece mucho más limpio tener cada puerto manejado de la misma manera, en lugar de tener el hilo principal manejar un puerto y un hilo adicional manejar el otro. Podría decirse que se puede arreglar en el ejemplo de la secuencia, pero luego está usando tres hilos.
Estoy escribiendo un pequeño servidor web en Python, utilizando BaseHTTPServer y una subclase personalizada de BaseHTTPServer.BaseHTTPRequestHandler. ¿Es posible hacer que esto escuche en más de un puerto?
Lo que estoy haciendo ahora
class MyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def doGET
[...]
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
pass
server = ThreadingHTTPServer((''localhost'', 80), MyRequestHandler)
server.serve_forever()
No es fácil. Puede tener dos instancias de ThreadingHTTPServer, escribir su propia función serve_forever () (no se preocupe, no es una función complicada).
La función existente:
def serve_forever(self, poll_interval=0.5):
"""Handle one request at a time until shutdown.
Polls for shutdown every poll_interval seconds. Ignores
self.timeout. If you need to do periodic tasks, do them in
another thread.
"""
self.__serving = True
self.__is_shut_down.clear()
while self.__serving:
# XXX: Consider using another file descriptor or
# connecting to the socket to wake this up instead of
# polling. Polling reduces our responsiveness to a
# shutdown request and wastes cpu at all other times.
r, w, e = select.select([self], [], [], poll_interval)
if r:
self._handle_request_noblock()
self.__is_shut_down.set()
Entonces nuestro reemplazo sería algo como:
def serve_forever(server1,server2):
while True:
r,w,e = select.select([server1,server2],[],[],0)
if server1 in r:
server1.handle_request()
if server2 in r:
server2.handle_request()
Por supuesto; simplemente inicie dos servidores diferentes en dos puertos diferentes en dos subprocesos diferentes, cada uno de los cuales usa el mismo controlador. Aquí hay un ejemplo completo y de trabajo que acabo de escribir y probar. Si ejecuta este código, podrá obtener una página web de Hello World en http: // localhost: 1111 / y http: // localhost: 2222 /
from threading import Thread
from SocketServer import ThreadingMixIn
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write("Hello World!")
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
pass
def serve_on_port(port):
server = ThreadingHTTPServer(("localhost",port), Handler)
server.serve_forever()
Thread(target=serve_on_port, args=[1111]).start()
serve_on_port(2222)