【问题标题】:Java simple code: java.net.SocketException: Unexpected end of file from serverJava简单代码:java.net.SocketException:来自服务器的文件意外结束
【发布时间】:2013-11-06 22:37:34
【问题描述】:

我用Java写了一些简单的代码,该方法应该连接到网站并返回BufferedReader。

private BufferedReader getConnection(String url_a) {
        URL url;
        try {
            System.out.println("getting connection");
            url = new URL(url_a);
            HttpURLConnection urlConnection = (HttpURLConnection) 
                     url.openConnection();
            urlConnection.addRequestProperty("User-Agent",
                    "Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924"
                     + "Epiphany/1.4.4 (Ubuntu)");
            inStream = new InputStreamReader(urlConnection.getInputStream());
            return new BufferedReader(inStream);
        } catch (Exception ex) {
            Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;

}

当我在我的电脑上使用它时,它可以正常工作,但是当我将 .jar 文件放在服务器上时,我得到了这个错误:

java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:718)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:715)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322)
at dataconverter.Reader.getConnection(Reader.java.260)

问题很奇怪,因为不是每次都抛出异常,有时一切正常,程序运行正常。

有人有什么想法吗?

【问题讨论】:

    标签: java sockets httpurlconnection


    【解决方案1】:

    “Unexpected end of file”意味着远程服务器接受并关闭了连接而没有发送响应。可能是远程系统太忙而无法处理请求,或者存在随机断开连接的网络错误。

    服务器中也可能存在错误:请求中的某些内容导致内部错误,并且服务器只是关闭连接而不是像应有的那样发送 HTTP 错误响应。一些人认为这是由于请求中缺少标头或无效标头值造成的。

    有了可用的信息,就不可能说出出了什么问题。如果您有权访问相关服务器,则可以使用数据包嗅探工具来查找发送和接收的确切内容,并查看服务器进程的日志以查看是否有任何错误消息。

    【讨论】:

      【解决方案2】:

      总结

      当您期待响应时遇到此异常,但套接字已突然关闭。

      详细说明

      Java 的 HTTPClient,发现 here,在非常特殊的情况下抛出带有消息“来自服务器的文件意外结束”的 SocketException

      发出请求后,HTTPClient 会获得一个绑定到与请求关联的套接字的InputStream。然后它反复轮询InputStream,直到它:

      1. 查找字符串“HTTP/1”。
      2. 在读取 8 个字符之前到达 InputStream 的末尾
      3. 查找“HTTP/1”以外的字符串。

      如果是数字 2,HTTPClient 将抛出这个 SocketException 如果以下任何一项为真:

      • HTTP方法是CONNECT
      • HTTP方法为POST,客户端设置为流模式

      为什么会发生这种情况

      这表明 TCP 套接字在服务器能够发送响应之前已关闭。发生这种情况的原因有很多,但一些可能性是:

      • 网络连接丢失
      • 服务器决定关闭连接
      • 客户端和服务器之间的某些东西(nginx、路由器等)终止了请求

      注意:当 Nginx 重新加载其配置时,it forcefully closes any in-flight HTTP Keep-Alive connections(甚至是 POST),会导致这个确切的错误。

      【讨论】:

        【解决方案3】:

        当我未设置身份验证标头或设置错误凭据时,我确实收到此错误。

        【讨论】:

          【解决方案4】:

          我建议使用线鲨来追踪数据包。如果您使用的是 Ubuntu,请使用 sudo-apt get wireshark。正如 Joni 所说,找出问题所在的唯一方法是跟踪 GET 请求及其相关响应。

          http://www.wireshark.org/download.html

          【讨论】:

            【解决方案5】:

            就我而言,只需将代理传递给连接即可解决。感谢@Andreas Panagiotidis

            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("<YOUR.HOST>", 80)));
            HttpsURLConnection con = (HttpsURLConnection) url.openConnection(proxy);
            

            【讨论】:

              【解决方案6】:

              在我的情况下 url 包含错误的字符,如空格。总体记录您的网址,在某些情况下使用浏览器。

              【讨论】:

                【解决方案7】:

                您设置的标题很可能不正确或不可接受。

                例子:

                connnection.setRequestProperty("content-type", "application/json");
                

                【讨论】:

                  【解决方案8】:

                  我也遇到了这个异常。我的错误代码如下

                          HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                      connection.setRequestMethod(requestMethod);
                          connection.setRequestProperty("Content-type", "JSON");
                  

                  我发现“Content-type”不应​​该是“JSON”,错了! 我通过将这一行更新到下面解决了这个异常

                          connection.setRequestProperty("Content-type", "application/json");
                  

                  您可以检查您的“内容类型”

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-12-11
                    相关资源
                    最近更新 更多