SocketException: Unexpected end of file from server 问题解决


最近使用elasticsearch,通过http访问,结果报错。最后发现是因为设置http消息内容格式type设置错了。发送http请求的方法如下:


public static String httpRequest(String urlStr, String content, String requestMethod) throws IOException {
        URL url = new URL(urlStr);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod(requestMethod);
        connection.setUseCaches(false);
        connection.setConnectTimeout(1000 * 5);//5秒
        connection.setReadTimeout(1000 * 60);//1分钟
        connection.setInstanceFollowRedirects(true);
        connection.setRequestProperty("Content-type", "application/json");
        connection.setRequestProperty("Authorization","esmadmin");
        connection.connect();
        Writer writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
        if (content != null && !"".equals(content)) {
            writer.write(content);
        }
        writer.flush();
        writer.close();
        InputStream in = null;
        if (connection.getResponseCode() >= 400) {
            in = connection.getErrorStream();
        } else {
            in = connection.getInputStream();
        }
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
        StringBuilder response = new StringBuilder();
        String tmp;
        while ((tmp = bufferedReader.readLine()) != null) {
            response.append(tmp);
        }
        if (in != null) {
            in.close();
        }
        bufferedReader.close();
        connection.disconnect();
        return response.toString();
    }

报错如下:

2017-08-11 08:00:00,441 pool-97-thread-1 ERROR [com.jd.jsf.worker.thread.es.timingTask.TimingTaskRunnableThread:run] - Unexpected end of file from server
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:792)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:789)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1535)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at com.jd.jsf.worker.util.SimpleHttpClient.request(SimpleHttpClient.java:126)
at com.jd.jsf.worker.util.SimpleHttpClient.put(SimpleHttpClient.java:104)
at com.jd.jsf.worker.thread.es.timingTask.TimingTaskRunnableThread.run(TimingTaskRunnableThread.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)


后面发现上面建立http请求的httpRequest方法中是有一句代码是关键:

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


我之前写成 connection.setRequestProperty("Content-type", "JSON");所以一直报错。

后面改成connection.setRequestProperty("Content-type", "application/json");就好了。

这个错误对于低版本的ES好像没问题,例如V2.1.2, V5.2.1都没问题。对于ES5.4.3有问题。应该是高版本的ES对于http请求格式加强了校验。




猜你喜欢

转载自blog.csdn.net/daydayupzzc/article/details/77097114