Клиент TCPIP-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.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();
}
}
});
}
}
что я делаю не так?
6 ответов
ошибка no route указывает, что при попытке подключения TCP соединение не удалось, поскольку базовое программное обеспечение протокола не смогло найти сетевой узел для сетевого узла маршрута к назначенному целевому узлу.
исправление зависит от операционной системы, но в основном требует настройки таблиц маршрутизации, чтобы устройство, с которого вы пытаетесь подключиться, могло выяснить, как добраться до устройства, к которому вы хотите соединять.
обычно вы указываете шлюз, к которому при попытке подключения запрос на подключение выходит из сетевого шлюза для разрешения другими устройствами информационных технологий, такими как маршрутизаторы и т. д.
Это похоже на Android-устройство, поэтому первое, что нужно сделать, это убедиться, что у вас есть подключение, будь то WiFi или сотовый. Другим было бы убедиться, что WiFi или сотовый включен и работает.
указанный вами IP-адрес обычно в частной подсети. Поэтому нужно проверить, находится ли устройство, к которому вы пытаетесь подключиться, в той же подсети, что и ваше устройство.
Это похоже на сетевую проблему, а не на проблему Java. Либо:
- сеть на клиенте либо не знает, как маршрутизировать пакеты на сервер,
- попытка подключения клиента к порту 4449 блокируется брандмауэром или фильтром пакетов, или
- вы используете неправильный IP-адрес.
(сообщение "No route to host" предполагает, что это первая проблема, но брандмауэры иногда настроены на предоставление вводящие в заблуждение ответы на нежелательный трафик.)
в любом случае, вам было бы лучше искать сайт о том, как настроить и / или сети и маршрутизацию.
Привет у меня была такая же проблема на моем mac и запуск приложения на устройстве android. Мне пришлось сделать следующие 2 вещи, чтобы заставить его работать:
- выключите брандмауэр на mac
- включить инфракрасный приемник (система Pref > безопасность > Брандмауэр > дополнительно)
и это сработало!
Я сталкиваюсь с той же проблемой, когда я разработал android-приложение для связи с Java desktop server, чтобы решить эту проблему, просто отключите usb-кабель, который соединяет телефон android с ПК.
загрузите приложение 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)
- Ага..
хост недоступен, просто так. Однако, если все в порядке (хорошо настроенный узел / сеть, хороший сигнал wifi,..) Вы можете заставить процесс с помощью ping serverIP
(от телефона) или ping smartphone
(от сервера).
ping (ICMP-пакеты) заставит маршрутизатор ускорить новую маршрутизацию (способ достичь хоста)... отправить много пакетов (опция-N), например: ping google.com -n 1000
(1000 последовательных пингуется)