您的位置:首页 > 其它

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

2017-08-11 14:59 2743 查看
最近使用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请求格式加强了校验。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐