现有服务器部署及问题出现点:
原因分析:
JsonDispatherHandler对response.getWriter()进行write和flush方法后,response.getWriter()就被Web服务器关闭了,这样在过滤器中去获取输出流并writer时,就会抛出Connection reset by peer的错误。
解决方法:
新建JsonDispatcherHandlerWithGzip.java,继承JsonDispatherHandler对相应方法进行重写,并修改配置文件,将配置文件相关配置都改成JsonDispatcherHandlerWithGzip.java。
public class JsonDispatcherHandlerWithGzip extends JsonDispatcherHandler { public final static String RESULT = "JsonView4WebDispatcherHandler_result"; private static final String NULL_JSON_STRING = "{}"; private String defaultContentType = "text/html"; @Override protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { long startTime = System.currentTimeMillis(); addResponseHeader(response); byte[] bytes = (byte[]) model.get(RESULT); if (isGZipEncoding(request)) { byte[] outData = null; if (bytes.length > 512) { byte[] gzipData = toGzipBytes(bytes); response.setHeader("Content-Encoding", "gzip"); response.setHeader("Transfer-Encoding", ""); response.setContentLength(gzipData.length); outData = gzipData; PASLogUtils.debugTrace("gzip end ,cost:" + (System.currentTimeMillis() - startTime)); } else { outData = bytes.length == 0 ? NULL_JSON_STRING.getBytes(response.getCharacterEncoding()):bytes; } ServletOutputStream output = response.getOutputStream(); output.write(outData); output.flush(); }else{ String resp = bytes.length == 0 ? NULL_JSON_STRING : new String(bytes, response.getCharacterEncoding()); PASLogUtils.debugTrace("Rest result =" + resp); Writer out = response.getWriter(); out.write(resp); out.flush(); } } /* * 增加响应头信息 */ private void addResponseHeader(HttpServletResponse response) { if (!StringUtils.hasText(response.getContentType())) { StringBuffer contentTypeBuffer = new StringBuffer(); contentTypeBuffer.append(defaultContentType); contentTypeBuffer.append(";charset=" + response.getCharacterEncoding()); response.setContentType(contentTypeBuffer.toString()); } } /* * 判断浏览器是否支持GZIP */ private boolean isGZipEncoding(HttpServletRequest request) { boolean flag = false; String encoding = request.getHeader("Accept-Encoding"); if (encoding.indexOf("gzip") != -1) { flag = true; } return flag; } public static byte[] toGzipBytes(byte[] srcData) { if (srcData == null || srcData.length == 0) { return null; } ByteArrayOutputStream out = new ByteArrayOutputStream(); GZIPOutputStream gzip = null; try { gzip = new GZIPOutputStream(out); gzip.write(srcData); } catch (IOException e) { PASLogUtils.debugErorr(e.getMessage()); } finally { if (gzip != null) { try { gzip.close(); } catch (IOException e) { e.printStackTrace(); } } } return out.toByteArray(); } }
这样问题就解决了。特别注意response.setHeader("Transfer-Encoding", "");这条语句,Transfer-Encoding: chunked表示输出的内容长度不能确定,普通的静态页面、图片之类的基本上都用不到这个。详细可以参见http://bijian1013.iteye.com/blog/2280945。
在这我特意做了如下测试:
1.将response.setHeader("Transfer-Encoding", "");这条语句去掉,请求后台都没有报错,但浏览器未能正常展示,分析发现是因为实际返回到浏览器的长度和Content-Length长度不一致导致浏览器未能正确解析。
2.将response.setHeader("Transfer-Encoding", "");改成将response.setHeader("Transfer-Encoding", "chunked");报“Could not complete request java.net.SocketException: Connection reset by peer: socket write error”错。
3.而如果将response.setHeader("Transfer-Encoding", "");和response.setContentLength(gzipData.length);这两条语句都去掉,就能正常。此时用http Watch看到信息如下:
相关推荐
read tcp 192.168.31.60:55550->104.18.123.25:443: read: connection reset by peer 传输异常 然后看见网上说可以配置阿里云提供的镜像加速 具体方式 进入阿里云的容器镜像服务 快速链接: 容器镜像服务 复制加速...
* Connection reset by peer:Connection reset by peer 是一种特殊的 SocketException,它发生在客户端和服务器端之间的连接断开后,导致连接的一端继续发送数据,引发该异常。 实践经验 通过实践经验,我们可以...
linux iptables防火墙黑名单(封IP) Connection reset by peer
例如,如果服务器端关闭了连接,而客户端还在尝试发送数据,那么客户端会收到"Connection reset by peer"的错误信息。 2. **未关闭的连接导致异常**:另一种情况是一端程序退出,但未正确关闭Socket连接。当另一端...
解决oracle数据库发生'Connection reset by peer' or 'Connection reset'的错误 这边的数据库连接是kettle自带的h2数据库,只要有kettle就有这个数据库,目录位于data-integration\samples\db\,连接方式是 ...
**Modbus TCP客户端和服务器示例** 在工业自动化和物联网(IoT)领域,Modbus是一种广泛使用的通信协议,它允许设备之间进行简单的数据交换。本文将深入探讨Modbus TCP,这是一种在网络环境中运行的Modbus变体,尤其...
根据给定的文件信息,我们可以总结出以下关于SQL数据库连接(Connection)的相关知识点: ### SQL数据库连接(Connection)概述 在Java中,`Connection`对象是JDBC API的核心组件之一,用于与数据库建立连接。它是...
4. **java.net.SocketException: (Connection reset 或 Connect reset by peer: Socket write error)** 这两种异常都表示连接已断开。可能的原因是一端关闭了Socket,而另一端仍在尝试读写。处理这类异常需要检测到...
**Socket error #10054 - Connection reset by peer** - **含义**:连接已被另一端关闭或重置。这种情况可能发生在服务器主动断开连接的情况下。 - **解决办法**: - 确认服务器端没有主动断开连接。 - 检查是否...
#### WSAECONNRESET (10054): Connection reset by peer. - **含义**:存在的连接被远程主机强制关闭。这种情况可能发生在远程主机上的应用程序突然停止运行、远程主机重启或远程方套接字上使用了“强制”关闭等...
Oracle Database 12c 环境 OGG 12.3.0.1.4 端口扫描导致 REP 进程abend: WARNING OGG-01223 Oracle GoldenGate ...WARNING OGG-01223 Oracle GoldenGate Manager for Oracle, mgr.prm: Connection reset by peer.
print('Connection reset by peer.') ``` 六、多线程或异步IO 在处理多个并发连接时,可以使用多线程或多进程,或者利用Python的asyncio库进行异步I/O。例如,使用asyncio创建一个简单的服务端: ```python import...
**前端项目-simple-peer.zip** 是一个包含前端项目源代码的压缩包,主要目的是实现一对一的WebRTC(Web Real-Time Communication)视频、语音通话以及数据通道的功能。WebRTC是一种允许网页浏览器进行实时通信(RTC...
部署单机多节点网络所用到的docker-peer.yaml文件。注意里面的空格,还有两个_sk改成自己的证书
2. **`"recv() failed (104: Connection reset by peer)"`**:这通常是因为服务器的并发连接数超过了其承载能力,或者是客户端提前关闭了连接。 3. **`"(111: Connection refused) while connecting to upstream"`**...