Я сделал очень простую серверную и клиентскую программу KryoNet. Если я подключаю клиента через localhost, он работает как положено. Теперь я хочу подключиться к нему извне, поэтому я настроил DNS для себя с помощью динамического инструмента DNS с noip.com. Когда я подключаюсь через DNS, KryoNet показывает правильный IP-адрес, но он не подключается.

Сервер:

public class ServerTester {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Server server = new Server();
        server.start();
        server.bind(TCP, UDP);

        server.getKryo().register(Packet.class);
        server.getKryo().register(TestPackage.class);

        server.addListener(new Listener() {
            public void received (Connection connection, Object object)
            {
                if (object instanceof Packet)
                {
                    if (object instanceof TestPacket)
                    {
                        TestPacket p1 = (TestPacket) object;
                        System.out.println("server received: " + p1.name);
                    }
                }
            }
        });
    }
}

Клиент:

public class ClientTester {

    public static void main(String[] args) {
        Client client = new Client();
        client.start();
        try {
            client.connect(5000, "my.dynamic.dns", TCP, UDP);
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Could not connect to server");
        }

        client.getKryo().register(Packet.class);
        client.getKryo().register(TestPacket.class);

        TestPacketp1 = new TestPacket();
        p1.name = "Menno Gouw";     
        client.sendTCP(p1);
    }
}

Я перенаправил порты, которые я использовал для TCP и UDP на моем маршрутизаторе. Не уверен, что при отображении портов существует угроза безопасности, поэтому я просто компенсирую этот вопрос. Я переадресовал порты как для своего IPv4-адреса, полученного из ipconfig, так и для моего реального интернет-адреса.

TCP = 8001
UDP = 8002

Public-Port-Range |  Target IP   | Target Port Range | Protocol
    8001-8002     | IPv4 Address |    8001-8002      |   Both
    8001-8002     | real Address |    8001-8002      |   Both

Так почему же клиент не подключается? Это переадресация моего порта или мой провайдер может как-то это блокировать?

Как я уже сказал, если я использую localhost (127.0.0.1) для моего клиента для подключения к серверу, все работает как положено. Когда я пытаюсь подключиться к моему динамическому DNS, я получаю сообщение KryoNet, что оно подключается к моему "реальному" IP-адресу в консоли:

00:00  INFO: Connecting: my.dynamic.dns/XXX.XXX.XXX.XXX:8001/8002

Но после 5000 мс не удается подключиться.

2 ответа2

3

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

Вы можете использовать веб-сайт тестера переадресации портов, который загружен, чтобы проверить, открыты ли порты и принимает ли трафик, но для истинного теста вам нужно будет попытаться соединиться с другим интернет-соединением вообще.

2

Как отметил @ Deadly-Bagel, ваш модем / маршрутизатор может не разрешать петлю NAT, т.е. возможность вашим клиентам локальной сети получать доступ к службам (таким как веб-сервер) через ваш собственный общедоступный IP-адрес.

Ресурс: https://en.wikipedia.org/wiki/Network_address_translation#NAT_loopback

Что, вероятно, происходит

  1. Ваш клиент Kryo подключается к вашему серверу DDNS (по его URL)
  2. Служба DDNS (например, DynDNS) сообщает вашему клиенту Kryo, какой IP-адрес домена (который является вашим публичным IP-адресом).
  3. Затем ваш клиент Kryo пытается подключиться к вашему собственному общедоступному IP-адресу и терпит неудачу, потому что ваш модем / маршрутизатор не может выполнить обратную петлю (и затем переслать) запрос обратно на ваш сервер Kryo.

Есть несколько возможных решений этого:

  1. Измените свой модем / маршрутизатор на тот, у которого есть петля NAT
  2. Отредактируйте компьютер, на котором вы используете файл hosts чтобы ваш URL-адрес DDNS указывал на 127.0.0.1 чтобы он взаимодействовал со службой DDNS.
  3. Если ваш Kryo Server находится на компьютере, отличном от вашего Kryo Client, вы можете привязать клиентский ПК Kryo, например, к своему мобильному телефону и использовать подключение 3G для проверки подключения вашего клиента к серверу.

С другой стороны, вы не должны делать переадресацию портов и указывать свой публичный IP-адрес как IP-адрес локальной сети - он не работает так. Весь смысл переадресации портов заключается в том, что запросы на стороне WAN направляются на устройство на стороне LAN.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .