Как я пишу Python сервер HTTP для слушания на нескольких портах?

Учитывая тот факт, что «this» в лямбда относится к содержащему классу, следующие компиляции без ошибок (с добавленными зависимостями, конечно):

public class MyClass {
    Function<Map, CustomStruct> sourceToStruct = source -> {
        CustomStruct result;
        Object value;

        for (String key : source.keySet()) {
            value = source.get(key);

            if (value instanceof Map) {
                value = this.sourceToStruct.apply((Map) value);
            }

            result.setValue(key, value);
        }

        return result;
    };
}
19
задан Dana the Sane 27 July 2009 в 03:11
поделиться

3 ответа

Конечно; только запустите два различных сервера на двух различных портах в двух различных потоках что каждое использование тот же обработчик. Вот полный, рабочий пример, который я просто записал и протестировал. При выполнении этого кода затем, Вы сможете получить Привет Мировую веб-страницу и по 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"))
34
ответ дан 30 November 2019 в 02:56
поделиться

Я сказал бы, что поточная обработка для чего-то это простое является излишеством. Вы - более обеспеченное использование некоторой формы асинхронного программирования.

Вот пример с помощью Скрученный :

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

я также думаю, что это выглядит намного более чистым, чтобы иметь каждый порт быть обработанным таким же образом, вместо того, чтобы иметь основной поток обрабатывают один порт, и дополнительный поток обрабатывают другой. Возможно это может быть зафиксировано в примере потока, но затем Вы используете три потока.

6
ответ дан 30 November 2019 в 02:56
поделиться

Не легко. У Вас могло быть два экземпляра 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()
5
ответ дан 30 November 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: