0

当您通过其 IP 地址连接时,我的设备会发布一个 html 页面。例如,如果我要在我的计算机上访问“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 时,它​​为空。

4

3 回答 3

2

URL(统一资源定位器)必须具有用于定位的资源index.html以及网络通信方式http://)。所以一个有效 URL 的例子可以是

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

192.168.1.104不代表 URL

于 2013-04-29T18:24:43.560 回答
1

您需要添加http://到您传递给方法的字符串的前面。

于 2013-04-29T18:18:52.790 回答
0

如下创建您的 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问题。

在您检查任何标头(例如 withgetContentType()或检索内容)之前,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()

如果您发现这很难理解,则可能有助于知道它类似于做 a new File(),它仅代表 aFile但不会创建一个(假设它不存在),除非您继续调用File.createNewFile()(或将其传递给一FileReader)。

于 2013-04-29T19:04:17.970 回答