zoukankan      html  css  js  c++  java
  • java.io.IOException: Premature EOF

    http访问第三方系统的接口时,小概率抛出下面的异常:

    java.io.IOException: Premature EOF
    at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565)
    at com.xxxxx.util.HttpUtil.getHttpsContent(HttpUtil.java:194)

    相关代码如下:

    	public static JSONObject getMsgRetry(String url, JSONObject json) throws IOException{
    		url = url + "?a=1";
    		for(Entry<String, Object> entry : json.entrySet()){
    			String key = entry.getKey();
    			Object value = entry.getValue();
    			url = url+"&"+key+"="+value;
    		}
    		HttpsURLConnection conn = HttpUtil.initHttpsConnectionKeepAlive(url, "GET");
    		String result = "";
    		try{
    			result = HttpUtil.getHttpsContent(conn, "utf-8");
    		}catch(Exception e){
    			logger.error("interface_error, let's retry.");
    			logger.error(e.toString());
    			try {
    				TimeUnit.SECONDS.sleep(2); // 延迟2秒,再重试 
    			} catch (InterruptedException e1) {
    				logger.error(e1.toString());
    			}
    			result = HttpUtil.getHttpsContent(conn, "utf-8");
    		}finally{
    			conn.disconnect();	
    		}
    		return JSONObject.parseObject(result);
    	}
    
    	public static String getHttpsContent(HttpsURLConnection conn,
    			String characterCode) throws IOException {
    		InputStream inputStream = conn.getInputStream();
    		InputStreamReader inputStreamReader = new InputStreamReader(
    				inputStream, characterCode);
    		BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
    		String str = null;
    		StringBuffer buffer = new StringBuffer();
    		while ((str = bufferedReader.readLine()) != null) {
    			buffer.append(str);
    		}
    		// 释放资源
    		bufferedReader.close();
    		inputStreamReader.close();
    		inputStream.close();
    		conn.disconnect();
    
    		return buffer.toString();
    	}
    

    上面的代码中:

    while ((str = bufferedReader.readLine()) != null) {
    			buffer.append(str);
    		}
    

      

    while语句有时会抛出异常:

    java.io.IOException: Premature EOF

    at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565)

    搜索发现,这个是普遍性的一个问题,解决方法:

    https://stackoverflow.com/questions/13210108/reading-a-web-page-in-java-ioexception-premature-eof

    代码如下修改:

    	public static String getHttpsContent(HttpsURLConnection conn, String characterCode) throws IOException {
    		InputStream inputStream = conn.getInputStream();
    		InputStreamReader inputStreamReader = new InputStreamReader(
    				inputStream, characterCode);
    		BufferedReader bufferedReader = new BufferedReader(
    				inputStreamReader);
    		// fix bug:  java.io.IOException: Premature EOF
    		//        at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565)
    		// https://stackoverflow.com/questions/13210108/reading-a-web-page-in-java-ioexception-premature-eof
    		StringBuffer sb = new StringBuffer();
    		int BUFFER_SIZE = 1024;
    		char[] buffer = new char[BUFFER_SIZE]; // or some other size, 
    		int charsRead = 0;
    		while ( (charsRead  = bufferedReader.read(buffer, 0, BUFFER_SIZE)) != -1) {
    			sb.append(buffer, 0, charsRead);
    		}
    
    		return sb.toString();
    	}
    

    搞定。原因是第三方接口可能没有发送http协议需要的结束行。

     The issue for you it may be that the server is not pushing that last end line character

  • 相关阅读:
    JDK -GET,POST
    (三十四)什么是自动化测试模型之模块化驱动测试实例
    Linux 运维命令及知识
    python_检测一些特定的服务端口有没有被占用
    程序员常用网站
    网络安全与CTF在线学习资源网站
    MySQL_语句
    python脚本实现自动安装nginx
    超赞的Linux软件
    Python运维中常用的_脚本
  • 原文地址:https://www.cnblogs.com/digdeep/p/11281722.html
Copyright © 2011-2022 走看看