Java教程示例代码报错:java.net.SocketException: Connection reset - 是什么原因导致的?

6

这是一个初学者的问题。

在执行来自使用URL章节的示例代码时,会抛出以下异常:

Exception in thread "main" java.net.SocketException: Connection reset at 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,我还尝试在URLReader类的第一行插入System.setProperty("http.proxyHost", "dslb-088-071-100-199.pools.arcor-ip.net");
  • 我尝试使用JSoup HTML解析器和org.apache.commons.io.FileUtils.copyURLToFile(URL, File)方法来获得类似的结果。

无论我尝试什么,我总是会遇到同样的错误:30秒左右什么都不会发生,然后就会抛出上述的SocketException异常。

我不知道如何继续解决这个问题。有用的信息将是在连接重置之前的30秒背景中发生了什么。

那么,究竟是什么原因导致了这个异常?

最小的提示都可以有所帮助!谢谢!


1
你能给我们提供完整的代码,并设置代理主机吗?顺便说一下,你的代码在我的电脑上成功执行了。 - Menelaos
@achingfingers,我非常确定这听起来像是代理问题。尝试通过telnet/putty和其他浏览器测试你的代理。另外,使用了什么类型的身份验证/端口/协议? - Menelaos
@meewoK 命令为:java -Dhttp.proxyHost=dslb-088-071-100-199.pools.arcor-ip.net - achingfingers
@achingfingers 我的意思是,既然在不使用代理的情况下代码可以正常执行,那么就说明代码本身没有问题。很可能是你尝试使用的代理不在线或不可用。为什么不尝试不使用代理来运行“java app”呢? - Menelaos
1
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/31264/discussion-between-achingfingers-and-meewok - achingfingers
显示剩余11条评论
2个回答

2

对于可以连接互联网的JVM,您的代码运行良好。

根据最初的问题和讨论:https://chat.stackoverflow.com/rooms/31264/discussion-between-achingfingers-and-meewok ,似乎要么是:

  • 中间的防火墙阻止了JVM进行连接(或其他类似的网络问题)。
  • 操作系统防火墙杀毒软件也会导致问题。

我的建议是尝试以下方法:

  • 在同一网络内的不同计算机上运行相同的应用程序(查看是否与特定PC有关)。
  • 在不同的网络上运行相同的应用程序。

1
} catch (Exception x) {System.out.println("No Connection");} 抛弃了异常消息,比仅声明主函数为“throws Exception”更糟糕 - artbristol
是的,除了这只是我从某个地方拿来的一个快速测试,以查看 OP 是否获得了 200。请在聊天中查看整个讨论。 - Menelaos
1
所以在我的情况下,是杀毒软件引起了问题。禁用浏览器保护功能后,一切都正常了...谢谢。 - achingfingers

-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();
    }
}

为什么要试一下?它解决了原始代码中的哪个问题? - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接