Не удается подключить сокет к ServerSocket, используя два компьютера в разных сетях

#java #sockets #serversocket

#ява #сокеты #serversocket

Вопрос:

Описание

Цель состоит в том, чтобы сервер запускался на моем компьютере, в то время как другой человек запускает клиент на своем компьютере, в другой сети,
это должно быть сделано с использованием классов Socket и ServerSocket из java.net пакета.

Ожидаемый результат — соединение между сервером и клиентом
Фактический вывод — нет соединения

Исходный код:

Примечание: Предоставляется минимальный объем кода, необходимый для подключения, без ненужных инструкций печати / журнала и другого кода, чтобы пользовательский интерфейс / приложение функционировали так, как задумано.

Server.java:

 class Server {
    ServerSocket server;
    Socket connection;
    final int PORT = 0xface    // random port

    public static void main(String[] args) {
        Server application = new Server();    // constructor is just for UI
        application.runServer();
    }

    private runServer() {
        server = new ServerSocket(PORT, 5);
        connection = server.accept();
    }
}
  

Client.java

 class Client {
    String charServerAddress;
    final int PORT = 0xface    // random port, same as Server port

    public static void main(String[] args) {
        Client application = new Client(args[0]);  // where args[0] is 127.0.0.1
        application.runClient();
    }
    
    public Client(String host) {chatServerAddress = host;}

    private runClient() {
        client = new Socket(InetAddress.getByName(chatServerAddress), PORT);
    }
}      
  

Результат

Сервер работает нормально, но клиент не может подключиться

Прежде чем приступить к проблеме

  1. Клиент подключается к localhost, то есть использует 127.0.0.1 в качестве аргумента в client = new Socket(InetAddress.getByName(chatServerAddress), PORT) .
    • Все работает так, как ожидалось; Клиент может подключаться к серверу.
  2. Клиент подключается с использованием IP-адреса сервера, сервер запускается на том же компьютере, что и клиент. Мы получили IP-адрес сервера, набрав ipconfig в cmd на компьютере, на котором он размещен, затем используя IPv4 Address .
    • Все работает так, как ожидалось; Клиент может подключаться к серверу.
  3. Клиент подключается, используя IP-адрес Сервера, сервер и клиент запускаются на разных машинах. Мы получили IP-адрес Сервера, набрав ipconfig в cmd на компьютере, на котором он размещен, затем используя IPv4 Address .
    • Проблема: нет сообщения об ошибке, однако клиент никогда не подключался к серверу.

Попытки решения

  1. Полное отключение брандмауэра Windows на обеих машинах.
  2. Переключение того, на какой машине размещен сервер, а на какой — Клиент.
  3. Используя другой PORT номер.
  4. Пингует одну машину с другой, набрав ping <IP Address> в cmd.

Все вышеперечисленное привело к одной и той же ошибке: connection timeout .

Комментарии:

1. какие-либо настройки брандмауэра? оба расположены в одной сети? ах, вы упомянули, что сети разные, тогда является ли адрес узла назначения общедоступным?

2. @mangusta При просмотре всех правил брандмауэра Java заблокировал некоторый доступ. Однако нашим первым решением было полностью отключить его на обеих машинах, что не сработало. Да, сервер и клиент находятся в разных сетях

3. Как подключены сети?

4. @NomadMaker Я не думаю, что это так, я подключен к Интернету через маршрутизатор через моего провайдера, а другой парень у себя дома, за много миль, подключен к Интернету через свой маршрутизатор через, возможно, другого провайдера.

5. Есть ли у вашего домашнего компьютера внешнее IP-имя? В противном случае, как вы находите ip-номер для подключения к нему?