【发布时间】:2015-05-02 16:25:16
【问题描述】:
好的,所以我写了一段代码测试我的java连接到互联网的能力。它应该从 www.google.com 获取 html 并在 JFrame 的 JTextArea 对象中显示内容。 这是代码,所以你可以清楚地看到:
import java.awt.Color;
import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JSoupFetchTest extends JFrame{
String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0";
boolean jsoupcond = true;
String address = "http://www.google.com";
JTextArea text;
public JSoupFetchTest(){
text = new JTextArea();
text.setPreferredSize(new Dimension(500, 500));
text.setBackground(Color.BLACK);
text.setForeground(Color.WHITE);
text.setVisible(true);
text.setLineWrap(true);
this.add(text);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.pack();
gogo();
}
private void gogo() {
if(jsoupcond){
text.setText(text.getText() +"\nstart...");
try {
text.setText(text.getText() +"\nConnecting to " +address+ "...");
Document doc = Jsoup.connect(address).userAgent(userAgent).get();
text.setText(text.getText() +"\nConverting page document into text");
String s = doc.toString();
text.setText(text.getText() +"\nText: \n" +s);
System.out.println();
} catch (Exception e) {
text.setText(text.getText() +"\n" +e.toString());
e.printStackTrace();
}
text.setText(text.getText() +"\nEnd.");
}
String html = downloadHtml(address);
text.setText(text.getText() +"\nDownloading HTML...");
text.setText(text.getText() +"\nHTML:");
text.setText(text.getText() +"\n" +html);
}
private String downloadHtml(String path) {
text.setText(text.getText() +"\ndownloadHtml entry point...");
InputStream is = null;
try {
text.setText(text.getText() +"\ntry block entered...");
String result = "";
String line;
URL url = new URL(path);
text.setText(text.getText() +"\nabout to open url stream...");
is = url.openStream(); // throws an IOException
text.setText(text.getText() +"\nurl stream opened...");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
text.setText(text.getText() +"\nstarting to read lines...");
while ((line = br.readLine()) != null) {
result += line;
}
text.setText(text.getText() +"\nreading lines finished...");
return result;
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if (is != null) is.close();
} catch (IOException ioe) { }
}
return "";
}
public static void main(String[] args) {
new JSoupFetchTest();
}
}
我还要补充一点:
1. 我的 Eclipse(因为我正在使用)无法连接到市场,也无法获取更新。
2. Eclipse 的网络浏览器运行良好。
3. 我的系统浏览器(Mozilla Firefox)连接正常
4.我将JSoupFetchTest导出到一个可运行的jar中并尝试从系统级别运行它,没有效果
5. 我运行的是 Windows 7 Professional MSDN 版
6. 我联系了 eclipse 支持,他们认为这不是 eclipse 的错,并建议我使用代理。
7. 我联系了我的 ISP 看看我是否确实是,他们说我不是。
8. 我更改了我的 JAVA 网络设置,现在它“直接”连接。在设置为“使用浏览器设置”之前,它也不起作用。
9.我的eclipse的Window -> Preferences -> General -> Network Connections active provider设置为“Native”,我也试过“Direct”
10.方法downloadHtml(String path)停在“is = url.openStream();”并且永远持续下去……
我从 JSoup 得到的例外是:
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:703)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1534)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:453)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:434)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:181)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:170)
at JSoupFetchTest.gogo(JSoupFetchTest.java:42)
at JSoupFetchTest.<init>(JSoupFetchTest.java:32)
at JSoupFetchTest.main(JSoupFetchTest.java:92)
我还尝试将 JSoup.connect 的超时设置为无穷大。然后它会一直持续下去。
在你们说我的问题是重复的,或者将我委托给其他外部可能的问题解决方案之前,请相信我 - 无论是我的问题还是我在那里 - 我已经浏览了数周的互联网以寻找解决方案我想把我的头发拉出来......
如果你能阻止我在我的 Eclipse 中安装东西以及开发除独立应用程序之外的任何东西,请提供帮助......
【问题讨论】:
-
您观察到的意外行为到底是什么?有没有例外;超时,挂?! “无法连接到互联网”有点不具体。
-
好,更进一步。我忘了问:当你把日食排除在外时会发生什么;意思是:你能从命令行成功运行程序吗?
-
一定要用JSoup吗?你能用普通的插座测试吗?这看起来像是一个本地配置问题,将 JSoup 排除在外将消除该库出现配置问题的一些可能性。
-
如果eclipse没关系;你为什么把你的(可能是我们的)时间留在等式中?我同意标记空间 - 从可能的“最简单”示例开始;如果可行 - 然后考虑让您的示例更复杂。
-
您可能有防火墙阻止 Java 连接。禁用它。
标签: java eclipse url connection jsoup