Я пишу эту игру на Java и у меня проблемы с сетевой архитектурой.
Я решил, что буду использовать UDP-пакеты. Я только в начале, но проблема, с которой я сталкиваюсь, заключается в том, что, похоже, сервер должен отвечать точно с того же IP / порта на клиент (который находится за маршрутизатором, который использует NAT), когда клиент подключил этот сервер.
Например, у меня есть клиент A за маршрутизатором. Клиент A имеет локальный IP-адрес 192.168.8.100 и подключается к серверу B через порт 1234. Сервер подключен к 11.11.11.11:2345.
Когда клиент A подключается к серверу B, он использует 192.168.8.100:1234, но маршрутизатор преобразует это в (например) 22.22.22.22:6789.
Теперь, когда сервер хочет отправить пакеты этому клиенту, это должно быть с 11.11.11.11:2345.
Я хотел бы отправить данные из другого порта, например 11.11.11.11:2222, но, похоже, это не работает, по крайней мере, с моим маршрутизатором.
Я хочу использовать другой порт, потому что я хочу иметь два потока, один для прослушивания и один для отправки данных, и каждый поток будет иметь свой собственный DatagramSocket. Но, как я сказал, когда клиент А подключается к серверу через порт 2345, я не могу отправлять данные с порта 2222.
Кто-нибудь знает, как это обрабатывается? Я делаю это на Java, но это не проблема конкретного языка.
UPDATE
После того как @Perception прокомментировал, у меня есть еще несколько вопросов относительно его комментариев:
ОК, поэтому, если я правильно понимаю, если у меня есть сервер, на котором размещено 1000 игр, в каждой из которых по 2 игрока, вся отправка / получение должна осуществляться через один DatagramSocket.
Насколько я понимаю, DatagramSocket является потокобезопасным, поэтому, я думаю, у меня может быть один поток, выполняющий:
datagramSocket.receive();
в то время как второй поток выполняет
datagramSocket.send(.....);
Правильно?
Кроме того, два потока могут отправлять данные одновременно через один и тот же DatagramSocket? Является ли отправка каким-либо образом сериализованным, что означает, что вторая send () запускается только после завершения предыдущего send () или данные отправляются одновременно?