比较来自世界各地的卖家的域名和 IT 服务价格

怎么修 java.net.SocketException: 破管?

我用 apache commons http client 对于挑战 url 使用方法 post 发布参数,很少给出以下错误。


java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0/Native Method/
at java.net.SocketOutputStream.socketWrite/SocketOutputStream.java:92/
at java.net.SocketOutputStream.write/SocketOutputStream.java:136/
at java.io.BufferedOutputStream.write/BufferedOutputStream.java:105/
at java.io.FilterOutputStream.write/FilterOutputStream.java:80/
at org.apache.commons.httpclient.methods.ByteArrayRequestEntity.writeRequest/ByteArrayRequestEntity.java:90/
at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody/EntityEnclosingMethod.java:499/
at org.apache.commons.httpclient.HttpMethodBase.writeRequest/HttpMethodBase.java:2114/
at org.apache.commons.httpclient.HttpMethodBase.execute/HttpMethodBase.java:1096/
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry/HttpMethodDirector.java:398/


有人可以告诉我什么导致这个例外以及如何调试它?
已邀请:

郭文康

赞同来自:

这是由:

通常,当另一端已经关闭时,记录连接;

较少通常对等节点关闭连接,而无需读取已在其结束时已等待的所有数据。

因此,在这两种情况下,您都有一个定义或实现的应用程序协议。

有一个第三种原因我不会在这里记录,但这包括点对点节点正在制作有意的重启动作,而不是正确的连接关闭。

奔跑吧少年

赞同来自:

在我们的情况下,我们在执行应用程序服务器上执行负载测试期间经历了此问题。 问题是我们需要向我们的额外内存添加额外的内存 JVM, 因为她结束了。 它解决了这个问题。

尝试增加可用的内存量 JVM 和 / 或者在获得这些错误时控制使用内存。

知食

赞同来自:

SocketException: 破碎的通道由 'other end' /客户端或服务器。/, 当您的代码从连接读取时的结束连接,或者记录在其中。

这是在客户端 - 服务器应用程序中的一个非常常见的排除,该应用程序从客户端接收来自应用程序的客户或服务器的流量。 例如,客户端是浏览器。 如果浏览器拨打电话 Ajax, 和 / 或者用户只关闭页面或浏览器,它可以意外地有效地杀死整个连接。 原则上,您将在另一端完成应用程序的任何时间看到此错误,并且您没有期待它。

如果您在应用程序中遇到此异常,则意味着您必须检查其发生的代码 IO /Input/Output/ 并用块包裹它 try/catch, 抓住这一点 IOException. 然后,您必须决定如何应对这种半想象的情况。

在你的情况下,你仍然有控制的最早的地方是挑战
HttpMethodDirector.executeWithRetry

- 所以确保呼叫将转动块 try/catch, 并根据您认为您需要处理它。

我最终没有建议注册特定错误 SocketException-Broken Pipe 除了任何其他级别 debug/trace. 此外,它可以用作攻击形式。 DOS /不使用服务/ 通过填写日志。 尝试硬化并对此常用脚本进行对申请进行粘附。

莫问

赞同来自:

所有开放的流动 & 连接必须正确关闭,因此下次尝试使用该对象 urlConnection, 他不会给出错误。 例如,以下代码更改对我进行了纠正此错误。

到:


OutputStream out = new BufferedOutputStream/urlConnection.getOutputStream///;
BufferedWriter bw = new BufferedWriter/new OutputStreamWriter/out//;
bw.write/"Some text"/;
bw.close//;
out.close//;


后:


OutputStream os = urlConnection.getOutputStream//;
OutputStream out = new BufferedOutputStream/os/;
BufferedWriter bw = new BufferedWriter/new OutputStreamWriter/out//;
bw.write/"Some text"/;
bw.close//;
out.close//;
os.close//; // This is a must.

帅驴

赞同来自:

我通过服务器实现了数据加载函数 FTP 当续订此下载时,我也在那里找到了同样的例外。
要消除此异常,您将始终必须断开与上一个会话的连接,并创建新的客户端实例和与服务器的新连接。 相同的方法可能是有用的 HTTPClient.

八刀丁二

赞同来自:

当我开发一个简单的应用程序时,我有同样的问题 Java, 这听取了混凝土 TCP. 我通常没有任何问题,但是当我推出一些压力测试时,我注意到一些连接有一个错误地打破了
socket write exception

.

调查结束后,我找到了一个解决问题的解决方案。 我知道这个问题很老,但我更愿意分享我的决定,有人可以找到它很有用。

问题在于创造 ServerSocket. 我从文档中读取有一个限制 50 插座。 如果您尝试打开另一个化合物,他们将被拒绝。 解决方案仅在更改服务器端的默认配置时组成。 在下一个情况下,我创建一个侦听端口的套接字服务器 TCP
10_000

并占据最大的等待插座
200

.


new Thread/// -> {
try /ServerSocket serverSocket = new ServerSocket/10_000, 200// {
logger.info/"Server starts listening on TCP port {}", port/;

while /true/ {
try {
ClientHandler clientHandler = clientHandlerProvider.getObject/serverSocket.accept//, this/;
executor.execute/clientHandler::start/;
} catch /Exception e/ {
logger.error/e.getMessage///;
}
}

} catch /IOException | SecurityException | IllegalArgumentException e/ {
logger.error/"Could not open server on TCP port {}. Reason: {}", port, e.getMessage///;
}
}/.start//;


的 Javadoc of
https://docs.oracle.com/javase ... .html
:

传入连接的最大队列长度 /请求连接/ 安装在参数中 backlog. 如果连接指示填充队列时,则化合物偏转。

君笑尘

赞同来自:

问题可能是您的已部署文件未使用正确的方法更新。 RMI. 检查你的界面 RMI 它具有更新的参数或更新的数据结构,您的客户端没有。 或者你的客户是什么? RMI 它没有与您的服务器版本不同的参数。

这只是一个合理的假设。 重新部署我的服务器应用程序的文件并重新测试问题后 "Broken pipe" 消失了。

石油百科

赞同来自:

上面的答案说明了这个原因。
java.net.SocketException: Broken pipe

: 另一端关闭了连接。 我想分享当我遇到他时发生的经验:

在客户请求标题中
Content-Type

错误地想知道了Query身体实际上是 /事实上,没有身体/

插座中的较低服务 tomcat 等待这个体型 /http 位于 TCP, 是通过封装和封装交付的 .../

什么时候 60 秒已过期 tomcat 抛出超时异常:
Servlet.service// for servlet [dispatcherServlet] in context with path [] threw exception
java.net.SocketTimeoutException: null


客户端收到代码代码的答案。 500 由于排除了等待时间。

客户端关闭连接 /因为他得到了答案/.

tomcat 抛出
java.net.SocketException: Broken pipe

, 因为客户关闭它。

有时 tomcat 不会丢掉破碎 pip 例外,因为例外 timeout 关闭连接为什么这样的差异也很困惑。

奔跑吧少年

赞同来自:

JavaDoc:

传入连接的最大队列长度 /a
请求连接/ 出发 50. 如果出现连接指示
填充队列时,连接偏转。

您必须增加参数 "backlog" 你的他 ServerSocket, 例如


int backlogSize = 50 ;
new ServerSocket/port, backlogSize/;

董宝中

赞同来自:

原因是远程节点关闭其插座 /例如,失败/, 因此,如果您尝试将数据写入它,例如,您将获得它。 要解决此问题,请保护读取操作。 / 插座中的条目 /try catch/, 然后管理连接丢失的情况 catch /renew connection, stop 程序,......等/:


try {
/* your code */
} catch /SocketException e/ {
e.printStackTrace//;
/* insert your failure processings here */
}

要回复问题请先登录注册