여러 포트에서 수신 대기하도록 Python HTTP 서버를 어떻게 작성합니까?

StackOverflow https://stackoverflow.com/questions/60680

  •  09-06-2019
  •  | 
  •  

문제

저는 BaseHTTPServer와 BaseHTTPServer.BaseHTTPRequestHandler의 사용자 정의 하위 클래스를 사용하여 Python으로 작은 웹 서버를 작성하고 있습니다.둘 이상의 포트에서 수신 대기하도록 할 수 있습니까?

내가 지금 하고 있는 일:

class MyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  def doGET
  [...]

class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): 
    pass

server = ThreadingHTTPServer(('localhost', 80), MyRequestHandler)
server.serve_forever()
도움이 되었습니까?

해결책

확신하는;각각 동일한 처리기를 사용하는 두 개의 다른 스레드에 있는 두 개의 다른 포트에서 두 개의 다른 서버를 시작하면 됩니다.다음은 제가 방금 작성하고 테스트한 완전한 실제 예제입니다.이 코드를 실행하면 두 곳 모두에서 Hello World 웹페이지를 얻을 수 있습니다. http://localhost:1111/ 그리고 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)

업데이트:

이는 Python 3에서도 작동하지만 세 줄을 약간 변경해야 합니다.

from socketserver import ThreadingMixIn
from http.server import HTTPServer, BaseHTTPRequestHandler

그리고

self.wfile.write(bytes("Hello World!", "utf-8"))

다른 팁

이렇게 간단한 것에 대한 스레딩은 과잉이라고 말하고 싶습니다.어떤 형태의 비동기 프로그래밍을 사용하는 것이 더 좋습니다.

다음은 사용 예입니다. 꼬인:

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()

또한 메인 스레드가 한 포트를 처리하고 추가 스레드가 다른 포트를 처리하는 대신 각 포트를 동일한 방식으로 처리하는 것이 훨씬 더 깔끔해 보인다고 생각합니다.아마도 스레드 예제에서 이 문제를 해결할 수 있지만 세 개의 스레드를 사용하게 됩니다.

쉽지는 않습니다.두 개의 ThreadingHTTPServer 인스턴스를 가질 수 있고, 자신만의 Serve_forever() 함수를 작성할 수 있습니다(복잡한 함수가 아니니 걱정하지 마세요).

기존 기능:

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()

따라서 우리의 교체는 다음과 같습니다.

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()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top