Как установить соединение UDP при наличии соединения TCP с клиентом?

1

У меня есть простой сервер, который имеет основной поток и принимает клиентов, и запускает новый поток для каждого клиента. Поэтому в этом потоке я хочу сделать другое соединение (UDP) с клиентом, но я смущен. Если работает 10 Threads (Clients), и все десять пытаются открыть DatagramSocket с тем же портом, что будет правильно выбрасывать SocketBindException? Так как я могу это сделать?

  • 0
    Нет такой вещи как соединение UDP. Как вы думаете, зачем вам нужно более одного сокета UDP? Вы не
Теги:
tcp
udp

4 ответа

2
Лучший ответ
  • Клиент подключается к серверу через TCP.
  • Решает, какой порт UDP прослушать. Отправляет эту информацию на сервер через TCP.
  • Создает поток, привязывается к UDP-порту, становится UDP-сервером

  • Сервер получает информацию о порте UDP в сокете TCP.
  • Создает поток UDP, получающий информацию о порте. Становится клиентом UDP.
  • Поток UDP подключается к UDP-серверу (который также является клиентом TCP).
1

Просто используйте другой порт для каждого UDP-соединения. Каждому потоку может быть передано два значения: клиент подключен через TCP и порт UDP, который поток может использовать для соединения с клиентом, и он будет использовать только этот порт. Таким образом, у вас нет столкновения, и метод, запускающий потоки, знает, какой поток использует порт для UDP.

0

В UDP-обмене с вашим клиентом ваш TCP-сервер ведет себя как отправитель UDP через сокет UDP. Нет такой связи, как UDP-соединение.

0

Привязка не удастся, если локальный порт уже открыт, но нет ничего, чтобы остановить вас от открытия нескольких локальных портов, по одному для каждого рабочего потока. Сервер просто отправляет ответы на удаленный ip/port, который отправил сообщение, и ответ отправится в исходный поток отправки.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню