Подтвердить что ты не робот

TCP\IP-клиент - EHOSTUNREACH (нет пути к хосту)

Я пытаюсь разработать приложение TCP/IP клиентского сервера. У меня есть сервер, работающий на моем ПК, и клиентское приложение работает на мобильном устройстве. Они оба находятся в одной сети Wi-Fi, но я не могу установить связь между ними. Хотя отладка клиентского приложения Android показала следующую ошибку:

09-21 01:08:40.422: W/System.err(8536): java.net.ConnectException: failed to connect to /192.168.15.115 (port 4449): connect failed: EHOSTUNREACH (No route to host)
09-21 01:08:40.453: W/System.err(8536):     at libcore.io.IoBridge.connect(IoBridge.java:114)
09-21 01:08:40.453: W/System.err(8536):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
09-21 01:08:40.453: W/System.err(8536):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
09-21 01:08:40.453: W/System.err(8536):     at java.net.Socket.startupSocket(Socket.java:566)
09-21 01:08:40.453: W/System.err(8536):     at java.net.Socket.tryAllAddresses(Socket.java:127)
09-21 01:08:40.453: W/System.err(8536):     at java.net.Socket.<init>(Socket.java:177)
09-21 01:08:40.453: W/System.err(8536):     at java.net.Socket.<init>(Socket.java:149)
09-21 01:08:40.453: W/System.err(8536):     at sabarish.example.client_mobile.MainActivity$1.onClick(MainActivity.java:61)
09-21 01:08:40.453: W/System.err(8536):     at android.view.View.performClick(View.java:3511)
09-21 01:08:40.453: W/System.err(8536):     at android.view.View$PerformClick.run(View.java:14105)
09-21 01:08:40.453: W/System.err(8536):     at android.os.Handler.handleCallback(Handler.java:605)
09-21 01:08:40.453: W/System.err(8536):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-21 01:08:40.453: W/System.err(8536):     at android.os.Looper.loop(Looper.java:137)
09-21 01:08:40.453: W/System.err(8536):     at android.app.ActivityThread.main(ActivityThread.java:4424)
09-21 01:08:40.453: W/System.err(8536):     at java.lang.reflect.Method.invokeNative(Native Method)
09-21 01:08:40.453: W/System.err(8536):     at java.lang.reflect.Method.invoke(Method.java:511)
09-21 01:08:40.453: W/System.err(8536):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-21 01:08:40.453: W/System.err(8536):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-21 01:08:40.453: W/System.err(8536):     at dalvik.system.NativeStart.main(Native Method)
09-21 01:08:40.457: W/System.err(8536): Caused by: libcore.io.ErrnoException: connect failed: EHOSTUNREACH (No route to host)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.Posix.connect(Native Method)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.IoBridge.connect(IoBridge.java:112)
09-21 01:08:40.457: W/System.err(8536):     ... 18 more

Код, который я использую:

public class MainActivity extends Activity {
    private Socket client;
    private PrintWriter printwriter;
    private EditText textField;
    private Button button;
    private String messsage;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textField = (EditText) findViewById(R.id.editText1); //reference to the text field
        button = (Button) findViewById(R.id.button1); //reference to the send button

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                messsage = textField.getText().toString(); //get the text message on the text field
                textField.setText("");      //Reset the text field to blank

                try {
                    client = new Socket("192.168.15.115", 4449);  //connect to server
                    printwriter = new PrintWriter(client.getOutputStream(),true);
                    printwriter.write(messsage);  //write the message to output stream

                    printwriter.flush();
                    printwriter.close();
                    client.close();   //closing the connection

                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }); 
    }
}

Что я делаю неправильно?

4b9b3361

Ответ 1

Ошибка отсутствия маршрута указывает на то, что при попытке установления TCP-соединения сбой подключения произошел, поскольку базовое программное обеспечение протокола не смогло найти маршрут сетевого узла к сетевому узлу к назначенному целевому узлу.

Исправление в некоторой степени зависит от операционной системы, но в основном оно требует от вас настройки таблиц маршрутизации, чтобы устройство, с которого вы пытаетесь подключиться, могло выяснить, как связаться с устройством, к которому вы хотите подключиться.

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

Это выглядит как устройство Android, поэтому прежде всего убедитесь, что у вас есть подключение, будь то Wi-Fi или сотовая связь. Другим было бы убедиться, что WiFi или сотовый включен и работает.

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

Вот документ о подсетях и маршрутизации.

Цитата из комментария на Android от пользователя destenson

Комментарий от пользователя destenson от 13 мая 2017 г. добавляет эту дополнительную информацию, специфичную для Android, и сообщения об ошибках, представленные в публикации.

Так как это Android, первое, что вам нужно посмотреть, это разрешения. 09-21 01: 08: 40.457: W/System.err(8536): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) указывает на то, что соединение на устройстве было запрещено политикой.

Ответ 2

Это похоже на сетевую проблему, а не на проблему с Java. Или:

  • сеть на клиенте либо не знает, как перенаправлять пакеты на сервер,
  • попытка подключения клиента к порту 4449 блокируется брандмауэром или фильтром пакетов или
  • вы используете неправильный IP-адрес.

(Сообщение "Нет маршрута к хосту" указывает, что это первая проблема, но брандмауэры иногда настроены на то, чтобы давать неверные ответы на нежелательный трафик.)

В любом случае вам будет лучше искать сайт о настройке и/или сетях и маршрутизации.

Ответ 3

Здравствуйте, у меня была такая же проблема в моем mac и запуске приложения в Android-устройстве. Я должен был сделать следующие 2 вещи, чтобы заставить его работать:

  • Отключить брандмауэр в Mac
  • Включить инфракрасный приемник (System Pref > Безопасность > Брандмауэp > Дополнительно)

И это сработало!

Ответ 4

Я сталкиваюсь с той же проблемой, когда я разработал приложение для Android, которое взаимодействует с настольным сервером Java, для решения проблемы просто отключите USB-кабель, который соединяет телефон Android с ПК.

Ответ 5

скачайте приложение ping на свой телефон и попробуйте ping ip сервера, если это нормально... если вы используете apache, поместите IP-адрес локального компьютера в конфигурационный файл httpd.conf.

# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 127.0.0.1:80
Listen 192.168.1.30:80  (your IP)

Ответ 6

Эта проблема связана с тем, что мы хотим создавать и модифицировать TCP и Интернет. Tuve que volver colocar los datos que tenia предопределенных.

Ответ 7

Угу..

Хост недостижим, точно так же. Однако, если все oK (хорошо настроенный node/network, хороший wifi-сигнал,..) Вы можете принудительно выполнить процесс с помощью ping serverIP (с телефона) или ping smartphone (с сервера).

Пинг (ICMP-пакеты) заставит маршрутизатор ускорить новую маршрутизацию (способ добраться до хоста)... отправить много пинов (опция -n), например: ping google.com -n 1000 (1000 последовательных пингов)