【问题标题】:java.net.SocketException: Network is unreachable: connectjava.net.SocketException:网络不可达:连接
【发布时间】:2011-10-13 04:04:56
【问题描述】:

我正在尝试使用此方法从 Web 服务器下载 xml 文本文件:

static void download (String url , String fileName) throws IOException{

            FileWriter xmlWriter;
            xmlWriter = new FileWriter(fileName);
            System.out.println("URL to download is : " + url);

            // here Exception is thrown/////////////////////////////////
            BufferedReader inputTxtReader = new BufferedReader
                        (new BufferedReader(new InputStreamReader(addURL.openStream())));
            ////////////////////////////////////////////////////////

            String str ;
            String fileInStr = "";

            str = inputTxtReader.readLine();

            while (!(str == null)  ){///&& !(str.equals("</tv>"))
                fileInStr += (str + "\r\n");
                str = inputTxtReader.readLine();
            }

            xmlWriter.write(fileInStr);
            xmlWriter.flush();
            xmlWriter.close();
            System.out.println("File Downloaded");
}

有时会抛出此异常(我指定的是代码):

java.net.SocketException: Network is unreachable: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.Socket.connect(Socket.java:518)
    at java.net.Socket.connect(Socket.java:468)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:389)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:516)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:233)
    at sun.net.www.http.HttpClient.New(HttpClient.java:306)
    at sun.net.www.http.HttpClient.New(HttpClient.java:318)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:788)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:729)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:654)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:977)
    at java.net.URL.openStream(URL.java:1009)
    at MessagePanel.download(MessagePanel.java:640)
    at WelcomThread.run(MainBody2.java:891)

请指导我

谢谢大家。

【问题讨论】:

  • !(str == null) 看起来很混乱,你应该写str != null
  • 您在哪里以及如何初始化 addURL 变量?

标签: java sockets exception network-programming


【解决方案1】:

您正面临连接中断。这是否发生在 3G、WiFi 或计算机上的“普通”连接中?

无论如何,在编写应用程序时,您必须假设连接可能会不时丢失。例如,对于手机,这种情况在地铁、地下室等中经常发生。对于 PC 应用程序,这种情况不太常见,但有时会发生。

重试可能是一个很好的解决方案。并且说明网络的干净错误消息目前也不可用。

【讨论】:

  • 我添加了一个线程,当请求超时它会再次尝试。这是有效的。因为在我的网络中,我们广播了几个媒体内容;出现这个问题。谢谢你的帮助
【解决方案2】:

“网络不可达”就是这个意思。您没有连接到网络。这是你的程序之外的东西。可能是操作系统设置、网卡、路由器等错误。

【讨论】:

  • 那个也是,但是是我还是那里没有addURL的定义?
【解决方案3】:

我不是有时而是每次都遇到java.net.SocketException 的情况。我已将-Djava.net.preferIPv4Stack=true 添加到 java 命令行,我的程序开始正常工作。

【讨论】:

    【解决方案4】:

    我没有用你的代码测试过,所以情况会完全不同,但我还是想分享我的经验。 (不过,这肯定为时已晚,我希望这个答案将来仍然对某人有所帮助)

    我最近遇到了和你类似的经历,比如有时网络无法访问,但有时却无法访问。简而言之,原因是超时太小。当连接因此失败时,Java 似乎会抛出 IOException 并声明“网络无法访问”。它非常具有误导性(我希望会说“超时”),我花了将近一个月的时间来检测它。

    在这里我找到了另一篇关于如何设置超时的帖子。 Alternative to java.net.URL for custom timeout setting

    同样,这可能与您所经历的情况不同,但将来会有人。

    【讨论】:

      【解决方案5】:

      这只是发生在我身上。没有一个答案有帮助,因为问题是我最近更改了目标主机配置并在那里放置了不正确的主机值。所以它也可能是错误的连接细节。

      【讨论】:

        【解决方案6】:

        在更新我的网络适配器配置(通过 PowerShell commandlet New-NetSwitchTeam 迁移到 NIC 耦合网络)后,我遇到了这个错误。我的猜测是,必须对 java 配置中的某些内容进行调整以反映 java 系统的这种变化。但目前尚不清楚应该在哪里进行更改。我正在进一步调查。

        【讨论】:

          猜你喜欢
          • 2013-09-16
          • 2014-02-09
          • 2013-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-22
          • 1970-01-01
          • 2012-04-28
          相关资源
          最近更新 更多