У меня есть простой сервер, который имеет основной поток и принимает клиентов, и запускает новый поток для каждого клиента. Поэтому в этом потоке я хочу сделать другое соединение (UDP) с клиентом, но я смущен. Если работает 10 Threads (Clients), и все десять пытаются открыть DatagramSocket с тем же портом, что будет правильно выбрасывать SocketBindException? Так как я могу это сделать?
Просто используйте другой порт для каждого UDP-соединения. Каждому потоку может быть передано два значения: клиент подключен через TCP и порт UDP, который поток может использовать для соединения с клиентом, и он будет использовать только этот порт. Таким образом, у вас нет столкновения, и метод, запускающий потоки, знает, какой поток использует порт для UDP.
В UDP-обмене с вашим клиентом ваш TCP-сервер ведет себя как отправитель UDP через сокет UDP. Нет такой связи, как UDP-соединение.
Привязка не удастся, если локальный порт уже открыт, но нет ничего, чтобы остановить вас от открытия нескольких локальных портов, по одному для каждого рабочего потока. Сервер просто отправляет ответы на удаленный ip/port, который отправил сообщение, и ответ отправится в исходный поток отправки.
Если сервер первым может отправить UDP обратно клиенту, то вам придется пройти через дополнительную проблему получения локального порта после привязки и отправки его на сервер по каналу TCP (или заранее выбрать номер порта и привязка к нему явно).
Если UDP-связь односторонняя, вы можете связать порт UDP в основном потоке и повторно использовать его во всех рабочих потоках. UDP не имеет отношения к подключению, поэтому нет состояния, которое необходимо поддерживать.