Как написать сервер UDP, который будет обслуживать n одновременных запросов от разных клиентов? - PullRequest
2 голосов
/ 10 января 2012

Я подключаю 10 устройств к локальной сети, все они имеют сервер udp, который выглядит следующим образом:

while(true){
   serverSocket.receive(receivePacket);
   dostuff(receivePacket);
}
serverSocket.close();

Теперь предположим, что 9 устройств одновременно пытаются установить соединение с 10-м устройством. Как я могу принять все 9 вместо только первого, который затем заблокирует сокет, пока сервер не завершит вычисления? Должен ли я начать поток, который будет заботиться о dostuf ()? Позволит ли это мне получать запросы от всех одновременных запросов, которые я получил?

Ответы [ 3 ]

3 голосов
/ 10 января 2012

Базовая схема будет включать в себя поток, отвечающий за обработку входящих запросов (с заданным вами пределом), а затем передачу их потокам обработчика / запроса. Когда каждый из этих рабочих потоков завершится, вы захотите обновить общий / глобальный счетчик, чтобы основной поток знал, что он может установить новое соединение. Это потребует определенной степени синхронизации, но может быть довольно забавным.

Вот идея:

serverThread:
    while true:
        serverLock.acquire()

        if numberOfRequests < MAX_REQUESTS:
            packet = socket.receive()
            numberOfRequests++
            requestThread(packet).run()
        else
            serverMonitor.wait(serverLock);

        serverLock.release()

requestThread:
    //handle packet

    serverLock.acquire()

    if numberOfRequests == MAX_REQUESTS:

    numberOfRequests--
        serverMonitor.pulse();

    serverLock.release()

Вы хотите убедиться, что синхронизация выполнена правильно, это просто для того, чтобы дать вам представление о том, с чего можно начать. Но когда вы освоитесь, вы сможете оптимизировать и улучшить. Одним конкретным улучшением, которое также поддается ограниченному количеству запросов, является то, что называется ThreadPool .

Несмотря на это, базовая структура практически одинакова для большинства серверов: главный поток отвечает за передачу запросов рабочим потокам. Это аккуратная и простая абстракция.

1 голос
/ 11 января 2012

Используйте пул потоков сравнительно большего размера, поскольку udp не требует ответа.

метод main будет работать как слушатель, а пул потоков будет выполнять остальную часть тяжелой работы

1 голос
/ 10 января 2012

Вы можете использовать темы для решения этой проблемы.Поскольку у java уже есть API, который обрабатывает потоки, вы можете просто создать экземпляр исполняемых исполнителей, взгляните на Интерфейс исполнителя .Вот еще одна полезная ссылка, которая потенциально может помочь: блокировка очереди

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...