6

所以这是一个初学者的问题

使用 urls章节执行示例代码时,它会抛出:

线程“主”java.net.SocketException 中的异常: 在 java.net.SocketInputStream.read(SocketInputStream.java:189) 处重置连接...

起源是openStream()方法。

这是代码:

    import java.net.*;
    import java.io.*;

    public class URLReader {

       public static void main(String[] args) throws Exception {

          URL oracle = new URL("http://www.oracle.com/");
          BufferedReader in = new BufferedReader(
          new InputStreamReader(oracle.openStream()));

          String inputLine;
          while ((inputLine = in.readLine()) != null) {
             System.out.println(inputLine);
          }
          in.close();
       }
    }

我知道关于该主题有类似的主题,但我找不到适合我的答案。

到目前为止我已经尝试过

  • 我已经按照这里的建议设置了代理主机 。命令是:java -Dhttp.proxyHost=dslb-088-071-100-199.pools.arcor-ip.net,我也尝试插入System.setProperty("http.proxyHost", "dslb-088-071- 100-199.pools.arcor-ip.net"); 在 URLReader 类的第一行。
  • 我尝试了 JSoup html 解析器和
  • org.apache.commons.io.FileUtils.copyURLToFile(URL, File) 方法得到类似的结果。

无论我尝试什么,我总是会得到同样的错误:大约 30 秒内什么都不会发生,然后它会抛出提到的 SocketException。

我根本不知道如何继续解决这个问题。有用的是获取有关在连接重置前 30 秒内后台发生的情况的信息。

那么究竟是什么导致了这个异常呢?

最小的提示可能会有所帮助!谢谢!

4

2 回答 2

2

您的代码对于可以连接到 Internet 的 JVM 运行良好。

基于原始问题和讨论:https ://chat.stackoverflow.com/rooms/31264/discussion-between-achingfingers-and-meewok似乎:

  • 中间防火墙阻止 JVM 建立连接(或其他类似的网络问题)。
  • 导致问题的操作系统防火墙防病毒软件。

我的建议是尝试:

  • 同一网络内不同计算机上的相同应用程序(查看它是否特定于 PC)。
  • 不同网络上的相同应用程序。
于 2013-06-05T14:32:28.303 回答
-1

试试 Apache HTTPClient。我希望所有的导入都包括在内,因为这段代码没有按原样测试......另外,你的 30 多岁是你的客户端的连接超时。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.SocketAddress;
import java.net.URI;

import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;


public class URLReader {

   public static void main(String[] args) throws Exception {
        HttpClient httpclient = new DefaultHttpClient();
        httpclient.getParams().setParameter(
                CoreConnectionPNames.CONNECTION_TIMEOUT, timeOut);
        httpclient.getParams().setParameter(
                CoreConnectionPNames.SO_TIMEOUT, 2 * timeOut);
        httpclient.getParams().setParameter(
                CoreConnectionPNames.STALE_CONNECTION_CHECK, false);
        httpclient.getParams().setParameter(
                CoreConnectionPNames.TCP_NODELAY, true);
        HttpHost proxy = new HttpHost(%proxyhost%, %proxyport%);
        HttpGet httpget = new HttpGet("http://www.oracle.com");
        HttpResponse resp = httpclient.execute(httpget);
        respCode = resp.getStatusLine().getStatusCode();

        BufferedReader br = new BufferedReader(new InputStreamReader(resp
                .getEntity().getContent()));
        String line = null;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        br.close();
    }
}
于 2013-06-05T14:57:00.523 回答