#android
#Android
Вопрос:
Я с помощью приведенного ниже условия проверяю, доступен ли IP-адрес или нет
if ( InetAddress.getByName(server1IPAddress).isReachable(1000) == false)
{
......
......
}
Он корректно работает с обычным IP-адресом 192.168.1.158
но когда я указываю номер порта вместе с внешним IP 61.17.172.4: 85, отображается ошибка UnknownHostException
.
Кто-нибудь поможет мне, пожалуйста
Комментарии:
1. Что произойдет, если вы удалите номер порта и просто передадите ip-адрес? похоже на 61.17.172.4..
2. Использовать inetsocket address sockaddr = новый inetsocket address (IP-адрес, портНо);
Ответ №1:
Просто мысль, я не слишком знаком с Inetaddress. Попробуйте использовать запятую, например InetAddress (строка ip, строка pt). Взгляните сюда:http://nmstl.sourceforge.net/doc/apiuc/classInetAddress.html#a2
Надеюсь, это поможет
Комментарии:
1. На самом деле я не могу разделить IP-адрес и порт, который поступил из внешнего источника
Ответ №2:
Я думаю, что это работает правильно. Порты, обозначенные таким образом, верны для таких протоколов, как http и в URL-адресах, но не для адресов хостов. Я думаю, вам нужно удалить часть порта, чтобы вызвать getByName.
Если у вас есть полный URL, подобныйhttp://host.com:85/foo/bar.html для получения адреса хоста можно использовать что-то вроде следующего:
public static String extractAddressFromUrl(String url) {
String urlToProcess = null;
//find protocol
int protocolEndIndex = url.indexOf("://");
if(protocolEndIndex>0) {
urlToProcess = url.substring(protocolEndIndex 3);
} else {
urlToProcess = url;
}
// If we have port number in the address we strip everything
// after the port number
int pos = urlToProcess.indexOf(':');
if (pos >= 0) {
urlToProcess = urlToProcess.substring(0, pos);
}
// If we have resource location in the address then we strip
// everything after the '/'
pos = urlToProcess.indexOf('/');
if (pos >= 0) {
urlToProcess = urlToProcess.substring(0, pos);
}
// If we have ? in the address then we strip
// everything after the '?'
pos = urlToProcess.indexOf('?');
if (pos >= 0) {
urlToProcess = urlToProcess.substring(0, pos);
}
return urlToProcess;
}
Кроме того, если вы пытаетесь выяснить, доступен ли хост, вы могли бы рассмотреть возможность использования ConnectivityManager.requestRouteToHost()
Ответ №3:
Разве вы не можете использовать метод, предложенный mmeyer, чтобы разделить входную строку на IP и порт, а затем использовать новый метод InetAddress? Непроверенный пример…
String urlToProcess = null; /* your input string */
int pos = urlToProcess.indexOf(':'); /* find the : */
if (pos >= 0) {
ipAddress = urlToProcess.substring(0,pos ); /* return ip without the port */
portNo = urlToProcess.substring(pos 1); /* return the port */
}
sockaddr = new InetSocketAddress(ipAddress, portNo);
if ( InetAddress.getByName(sockaddr).isReachable(1000) == false) {
...your code....
}
Как я уже сказал, я не эксперт и не проверял код, так что отнеситесь к этому с недоверием. Это просто комбинация ответов всех.