当前位置: 首页 > 知识库问答 >
问题:

Java简单代码:Java。网SocketException:来自服务器的文件意外结束

苏晓博
2023-03-14

我在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)

问题很奇怪,因为每次都不会抛出异常,有时一切都很好,程序工作正常。

有人有什么想法吗?

共有3个答案

徐智渊
2023-03-14

当我没有设置身份验证标头或设置了错误的凭据时,确实会出现此错误。

太叔乐家
2023-03-14

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

在这里可以找到Java的HTTPClient,它在非常特定的情况下抛出一个带有消息“来自服务器的文件意外结束”的SocketException

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

  1. 查找字符串“HTTP/1”

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

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

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

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

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

梅耘豪
2023-03-14

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

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

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

 类似资料: