http访问第三方系统的接口 java.io.IOException: Premature EOF

http访问第三方系统的接口时,小概率抛出下面的异常:
java.io.IOException: Premature EOF
异常如下:

xxxBiz 推送数据异常
 java.io.IOException: Premature EOF
	at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565) ~[?:1.8.0_144]
	at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:609) ~[?:1.8.0_144]
	at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:696) ~[?:1.8.0_144]
	at java.io.FilterInputStream.read(FilterInputStream.java:133) ~[?:1.8.0_144]
	at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3375) ~[?:1.8.0_144]
	at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[?:1.8.0_144]
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[?:1.8.0_144]
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:1.8.0_144]
	at java.io.InputStreamReader.read(InputStreamReader.java:184) ~[?:1.8.0_144]
	at java.io.BufferedReader.fill(BufferedReader.java:161) ~[?:1.8.0_144]
	at java.io.BufferedReader.readLine(BufferedReader.java:324) ~[?:1.8.0_144]
	at java.io.BufferedReader.readLine(BufferedReader.java:389) ~[?:1.8.0_144]
	at com.winchance.hcl.common.util.HttpUtils.inputStream2String(HttpUtils.java:327) ~[classes/:?]

相关代码如下:

	public static String post(String address, Map<String, String> headerParameters, String body) throws Exception {
		if (body != null) {
			return proxyHttpRequest(address, "POST", headerParameters, body);
		}
		return proxyHttpRequest(address, "POST", null, getRequestBody(headerParameters));
	}
	public static String proxyHttpRequest(String address, String method, Map<String, String> headerParameters,
			String body) throws Exception {
		String result = null;
		HttpURLConnection httpConnection = null;

		try {
			httpConnection = createConnection(address, method, headerParameters, body);
			String encoding = "UTF-8";
			if (httpConnection.getContentType() != null && httpConnection.getContentType().indexOf("charset=") >= 0) {
				encoding = httpConnection.getContentType()
						.substring(httpConnection.getContentType().indexOf("charset=") + 8);
			}
			result = inputStream2String(httpConnection.getInputStream(), encoding);
		} finally {
			if (httpConnection != null) {
				httpConnection.disconnect();
			}
		}
		return result;
	}

	
	/**
	 * 读取inputStream 到 string
	 * @param input
	 * @param encoding
	 * @return
	 * @throws IOException
	 */
	private static String inputStream2String(InputStream input, String encoding)
			throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(input,
				encoding));
		StringBuilder result = new StringBuilder();
		String temp = null;
		while ((temp = reader.readLine()) != null) {
			result.append(temp);
		}
		return result.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
代码如下修改:

	/**
	 * 读取inputStream 到 string
	 * 
	 * @param input
	 * @param encoding
	 * @return
	 * @throws IOException
	 */
	private static String inputStream2String(InputStream input, String encoding) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(input, encoding));
	    // 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
		StringBuilder result = new StringBuilder();
		int BUFFER_SIZE = 1024;
	    char[] buffer = new char[BUFFER_SIZE]; // or some other size,
	    int charsRead = 0;
	    while ( (charsRead  = reader.read(buffer, 0, BUFFER_SIZE)) != -1) {
	    	result.append(buffer, 0, charsRead);
	    }
		return result.toString();

	}

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

### Java接口中的`java.io.IOException: Connection reset by peer`和`Broken pipe`错误解析 当应用程序遭遇`java.io.IOException: Connection reset by peer` 或 `Broken pipe` 错误时,这通常意味着网络连接被远程主机突然关闭或本地尝试向已断开的连接写入数据。此类问题可能源于多种因素,包括但不限于防火墙配置不当、服务器过载、超时设置不合理或是协议版本不兼容等问题。 针对上述两种异常情况,有几种常见的处理方法: #### 修改Tomcat Connector配置以适应高并发场景 对于运行于Apache Tomcat上的应用而言,调整其<Connector>标签内的参数可以有效缓解部分因连接重置引发的问题。例如,将默认使用的HTTP/1.1协议更改为特定实现如`org.apache.coyote.http11.Http11NioProtocol`有助于提高稳定性[^3]: ```xml <Connector port="8760" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443"/> ``` #### 调整Netty代理客户端初始化逻辑 如果项目基于Netty框架构建,则可以在创建管道处理器链的过程中显式指定目标服务端地址信息来规避潜在的风险。具体做法是在调用`context.newHandler()`函数的同时传入远端主机名与端口号作为额外参数[^2]: ```java socketChannel.pipeline().addLast( context.newHandler(socketChannel.alloc(), "targetHost", targetPort)); ``` #### 配置Nginx反向代理相关指令优化 当使用Nginx作为前端负载均衡器或静态资源分发节点时,适当增大缓冲区大小并确保各层缓存机制之间的一致性同样重要。特别是要保证`proxy_busy_buffers_size`不低于最大允许值`proxy_buffer_size`,从而减少由于流量突增造成的连接中断概率[^4]: ```nginx http { ... proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } ``` 通过以上措施的应用,在很大程度上能够降低甚至消除由`Connection reset by peer` 及 `Broken pipe` 所带来的负面影响。当然,实际操作过程中还需结合具体情况灵活应对,并持续监控系统表现以便及时作出相应调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值