Передача файла java UDP для нескольких клиентов, не может привязать один и тот же адрес

Мой проект представляет собой передачу файлов UDP.

Поток таков:

  1. сервер получает запрос клиента
  2. сервер отправляет байты файла клиенту через UDP-пакет
  3. цикл 1-2 при подключении нового клиента (поток)

Нужно ли создавать один сокет для одного клиента?

Когда я тестирую свой локальный хост и создаю более одного сокета, возникает исключение (адрес уже используется).

Как реализовать это приложение? Есть идеи ? или моя концепция неверна?


person kyktommy    schedule 08.01.2012    source источник
comment
Передача данных UDP не рекомендуется, если вы не передаете файл по внутренней сети или не реализуете свой собственный механизм подтверждения :) В Интернете есть всевозможные проблемы, такие как потеря пакетов, изменение порядка.   -  person Chris Dennett    schedule 08.01.2012
comment
Нет, вы создаете один сокет на стороне сервера, который обрабатывает все входящие запросы udp. UDP не имеет соединений. Есть только отдельные пакеты, которые могут прийти откуда угодно.   -  person Marc B    schedule 08.01.2012
comment
@Chris: Если бы изменение порядка было проблемой, вы бы все равно использовали TCP. udp — вполне допустимый протокол во многих случаях использования.   -  person Marc B    schedule 08.01.2012
comment
@MarcB Изменение порядка является проблемой, равно как и дублирование и удаление пакетов. UDP подходит в тех случаях, когда это не имеет значения, например. аудио или видео, но точно не для передачи файлов, если только не наложить что-то вроде TFTP.   -  person user207421    schedule 31.07.2019


Ответы (1)


Только один сокет в каждый момент времени может быть связан с любым портом UDP.

Похоже, у вас может быть более одного потока, вызывающего bind(), что приведет к тому, что все, кроме первого, вернут ошибку «уже используется». Вам нужно только вызвать bind() один раз в начале, прежде чем вы создадите свои рабочие потоки.

Если вам нужно несколько потоков для обработки входящих сообщений, у вас должен быть один поток-диспетчер, прослушивающий сокет и отправляющий сообщения рабочим потокам.

Если вам нужно несколько потоков для отправки исходящих сообщений, все они могут использовать один и тот же дескриптор.

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

person Seth Noble    schedule 09.01.2012