2013-04-29 110 views
0

我有设备发布一个HTML页面,当你通过他们的IP地址连接。例如,如果我要在计算机上转到“192.168.1.104”,我会看到设备发布的html页面。我想刮这个HTML,但我得到了一些错误,特别是在我的方法的第一行MalformedURLException。我在下面发布了我的方法。我发现了一些获取html的代码,并根据我的需要调整了它。谢谢java - 从IP地址获取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时,它是空的。

+0

URL不能是IP地址 - 它应该是像 - http://192.168.1.104:8080/app/index.html – sanbhat 2013-04-29 18:19:14

回答

1

您需要将http://添加到您传入该方法的String前面。

2

URL(统一资源定位器)必须有一个资源与网络通信(http://)的装置沿定位(index.html)。因此,有效的URL的一个例子可以

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

仅仅192.168.1.104不代表URL

0

创建您的网址如下:因为你正在阅读一个潜在的长期HTML

URL url = new URL("http", ipToPoll, -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(); 


编辑:回应您的contentType将为null问题。

之前检查的所有头像getContentType()getInputStream()检索内容,你需要实际上通过调用

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()第一(它错误地暗示,但)建立与URL资源的连接它不建立任何连接。它只是给你一个URLConnection的实例来让你指定连接属性,如连接超时setConnecTimeout()

如果你发现这个很难理解它可能有助于知道这是类似于做​​它只是代表File但不创建一个(假设它不存在),除非你继续前进,请致电File.createNewFile()(或将其传递给FileReader)。

+0

我试图实现这一点,但是当我尝试从URL连接获取contentType时,它是空的。我已经编辑了我的帖子以反映这些变化。 – kaptaincooke 2013-04-30 11:06:53

+0

@检查更新。你缺少对connect()的调用。 – 2013-04-30 12:36:21