Java简单代码:java.net.SocketException:来自服务器的文件意外结束

新手上路,请多包涵

我用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;

}

当我在我的 PC 上使用它时,它工作正常,但是当我将 .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)

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

有人有什么想法吗?

原文由 Maciej Skrzypiński 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

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

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

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

原文由 Joni 发布,翻译遵循 CC BY-SA 4.0 许可协议

概括

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

详细说明

Java 的 HTTPClient ,在 此处 找到,在非常特殊的情况下抛出 SocketException 消息“来自服务器的文件意外结束”。

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

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

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

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

为什么会这样

这表示在服务器能够发送响应之前 TCP 套接字已关闭。这可能出于多种原因而发生,但一些可能性是:

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

注意:当 Nginx 重新加载其配置时, 它会强制关闭任何正在进行的 HTTP Keep-Alive 连接(甚至是 POST),从而导致这个确切的错误。

原文由 Cory Klein 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题