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

时间:2013-11-06 22:37:34

标签: java sockets httpurlconnection

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

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

有人有任何想法吗?

8 个答案:

答案 0 :(得分:47)

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

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

答案 1 :(得分:27)

摘要

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

详细说明

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

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

  1. 查找字符串" HTTP / 1。"
  2. 在读取8个字符之前达到InputStream的结尾
  3. 查找" HTTP / 1以外的字符串。"
  4. 如果是数字2,HTTPClient会抛出此SocketException ,如果以下任何一项为真:

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

    为什么会发生这种情况

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

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:0)

我建议使用wire shark来跟踪数据包。如果您使用的是Ubuntu,sudo-apt将获得wireshark。就像Joni所说,找出问题的唯一方法是遵循GET请求及其相关的响应。

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

答案 4 :(得分:0)

在我的情况下,只需将代理传递给连接即可解决。感谢@Andreas Panagiotidis

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

答案 5 :(得分:0)

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

示例: connnection.setRequestProperty(“ content-type”,“ application / json”);

答案 6 :(得分:0)

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

答案 7 :(得分:-3)

我也得到了这个例外。我的错误代码低于

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

我发现“内容类型”不应该是“JSON”,是错误的! 我通过将此行更新到下面的

来解决了这个异常
        connection.setRequestProperty("Content-type", "application/json");

您可以查看“内容类型”