【问题标题】:Java URLConnection works with windows,but not with linuxJava URLConnection 适用于 windows,但不适用于 linux
【发布时间】:2012-03-09 05:42:05
【问题描述】:

在我的 java 程序中,我使用 URLConnection 来获取一个 url。它在 windows 下可以正常工作,但在 linux 下它不起作用。我想知道为什么。

代码:

Properties prop = System.getProperties();
prop.setProperty("http.proxyHost", "127.0.0.1");
prop.setProperty("http.proxyPort", "8080");
System.setProperty("sun.net.client.defaultConnectTimeout", "20000");   
System.setProperty("sun.net.client.defaultReadTimeout", "20000");   
URLConnection conn = new URL(url).openConnection();
InputStream is = conn.getInputStream();
byte [] buff = new byte[is.available()];//1024];
int read = is.read(buff);
System.out.println("buff:" + buff.length);
String result = "";
if(read > 0) {
    result = new String(buff, 0, read);
    read = is.read(buff);
    System.out.println("result:" + result);
}

原来byte是空的,read=0。

但是在windows下它可以正常工作。

我也试过设置 User-Agent 字段,没有什么不同。

HttpURLConnection也试过了,同样的问题。

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8080));
HttpURLConnection conn = (HttpURLConnection)(new URL(url).openConnection(proxy));

这种方式也试过了,也失败了。

所有这些方法都适用于 windows。

可以在这台电脑上使用相同的代理使用firefox很好地打开网址,顺便说一句。

【问题讨论】:

  • 通过将byte [] buff = new byte[is.available()]; 更改为byte [] buff = new byte[1024]; 来工作似乎is.available() 不起作用,但为什么呢?
  • 它工作正常,只是不像你认为的那样。检查Javadoc。 available() 的正确用法很少,这不是其中之一。

标签: java linux httpurlconnection urlconnection


【解决方案1】:

available() 方法的 javadocs 中,它说:

返回在下一次调用该输入流的方法时可以从该输入流无阻塞读取(或跳过)的估计字节数。

关键是“不阻塞”。该方法不会返回预期是您尝试从中读取的 url 的内容长度的字节数。使用固定大小的缓冲区应该可以解决您的问题,而不是 InputStream.available() 可能返回 0。

【讨论】:

  • 我想通了,另见this。它只检查当前进程中是否有可用数据(在输入缓冲区中)。谢谢,朋友。
  • 我可以猜测底层操作系统流的行为是不同的,但这只是一个猜测。原因可能有很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2016-03-01
  • 2021-05-02
  • 2017-06-14
  • 2011-06-15
  • 2021-10-27
相关资源
最近更新 更多