java — получить html с IP-адреса

У меня есть устройства, которые публикуют html-страницу при подключении через их IP-адрес. Например, если бы я перешел на «192.168.1.104» на своем компьютере, я бы увидел html-страницу, которую публикует устройство. Я пытаюсь очистить этот html, но получаю некоторые ошибки, в частности MalformedURLException в первой строке моего метода. Я разместил свой метод ниже. Я нашел код для получения html и подправил его под свои нужды. Спасибо

public String getSbuHtml(String ipToPoll) throws IOException, SocketTimeoutException {
    URL url = new URL("http", ipToPoll, -1, "/");
    URLConnection con = url.openConnection();
    con.setConnectTimeout(1000);
    con.setReadTimeout(1000);
    Pattern p = Pattern.compile("text/html;\\s+charset=([^\\s]+)\\s*");
    Matcher m = p.matcher(con.getContentType());
    String charset = m.matches() ? m.group(1) : "ISO-8859-1";
    BufferedReader r = new BufferedReader(
            new InputStreamReader(con.getInputStream(), charset));
    String line = null;
    StringBuilder buf = new StringBuilder();
    while ((line = r.readLine()) != null) {
        buf.append(line).append(System.getProperty("line.separator"));
    }
    return buf.toString();
}

РЕДАКТИРОВАТЬ: приведенный выше код был изменен, чтобы отразить создание нового URL-адреса для правильной работы с ip. Однако, когда я пытаюсь получить contentType из соединения, он равен нулю.


person kaptaincooke    schedule 29.04.2013    source источник
comment
URL-адрес не может быть IP-адресом — он должен быть примерно таким: 192.168.1.104:8080/app/index. html   -  person sanbhat    schedule 29.04.2013


Ответы (3)


URL (унифицированный указатель ресурса) должен иметь ресурс для поиска (index.html) вместе с средствами сетевого взаимодействия (http://). Таким образом, пример действительного URL-адреса может быть

http://192.168.1.104:8080/app/index.html 

Просто 192.168.1.104 не представляет собой URL

person sanbhat    schedule 29.04.2013

Вам нужно добавить http:// в начало вашей строки, которую вы передаете в метод.

person austin    schedule 29.04.2013

Создайте свой URL-адрес следующим образом:

URL url = new URL("http", ipToPoll, -1, "/");

И поскольку вы читаете потенциально длинную HTML-страницу, я полагаю, что здесь поможет буферизация:

BufferedReader r = new BufferedReader(
                   new InputStreamReader(con.getInputStream(), charset));
String line = null;
StringBuilder buf = new StringBuilder();
while ((line = r.readLine()) !- null) {
    buf.append(line).append(System.getProperty("line.separator"));
}
return buf.toString();


РЕДАКТИРОВАНИЕ: в ответ на вашу проблему с событием contentType null.

Прежде чем проверять какие-либо заголовки, например с помощью getContentType(), или извлекать содержимое с помощью getInputStream(), вам необходимо фактически установить соединение с ресурсом URL, вызвав

URL url = new URL("http", ipToPoll, "/"); // -1 removed; assuming port = 80 always
// check your device html page address; change "/" to "/index.html" if required

URLConnection con = url.openConnection();

// set connection properties
con.setConnectTimeout(1000);
con.setReadTimeout(1000);

// establish connection
con.connect();

// get "content-type" header
Pattern p = Pattern.compile("text/html;\\s+charset=([^\\s]+)\\s*");
Matcher m = p.matcher(con.getContentType());

Когда вы сначала вызываете openConnection() (это ошибочное предположение, но), он не устанавливает никакого соединения. Он просто дает вам экземпляр URLConnection, чтобы вы могли указать свойства соединения, такие как тайм-аут соединения с setConnecTimeout().

Если вам это трудно понять, полезно знать, что это аналогично выполнению new File(), которое просто представляет File, но не создает его (при условии, что оно еще не существует), если вы не пойдете дальше и не вызовете File.createNewFile() (или передать его FileReader).

person Ravi K Thapliyal    schedule 29.04.2013
comment
Я пытаюсь реализовать это, но когда я пытаюсь получить тип контента из URL-соединения, он равен нулю. Я отредактировал свой пост выше, чтобы отразить эти изменения. - person kaptaincooke; 30.04.2013