У меня есть сервер с открытым IP без NAT.Он получает пакеты UDP, и я хочу отправить их каждому подключенному клиенту.
Клиент или клиенты будут за NAT.
Я читал об UDP дыроколе, но это не совсем то, что я хочу.Я не пытаюсь отправить от клиента к клиенту.Я хочу, чтобы поток данных шел от клиента -> сервера -> всех клиентов.
Клиент
// Init TCP Socket
connection = new Socket(connectionAddress, 54540);
// Create receive socket
DatagramSocket socketReceive = new DatagramSocket(54541);
Сервер
// Receive socket
receiveAudioSocket = new DatagramSocket(54541);
// Thread to handle new received packets
ServerAudioReceiverWorker audioReceiverWorker = new ServerAudioReceiverWorker(receiveAudioSocket, this);
audioReceiverWorker.start();
// TCP Socket
serverSocket = new ServerSocket(54540);
System.out.println("Server has started");
Это базовая настройка для моего клиентского сервера.
Я ожидал, что если я отправлюUDP-пакет от клиента к общедоступному IP-адресу сервера.Маршрутизатор добавил бы правило NAT для порта 54541 в сети клиентов для получения пакетов UDP, отправленных с сервера обратно на общедоступный IP-адрес клиента и порт 54541. Не похоже, что он работает таким образом.
Я полагаю, это связано с тем, что назначаемому правилу NAT назначается определенный порт для запросов к общедоступному IP-адресу для назначения локального IP-адреса.Я не уверен, как найти порт, на который сервер должен отправлять пакеты для каждого клиента.
Нужно ли использовать UPnP, чтобы открыть порт в сети клиента и сообщить серверу, какой портотправлять пакеты на.