修复 Java 中 Java.Net.SocketException: Broken Pipe 错误
本篇文章介绍了使用 Java 编程的 java.net.SocketException: Broken pipeline
错误,并重点介绍了其可能的原因和解决方案。
错误描述、原因及解决方法
在找出错误原因并寻找解决方案之前,了解错误非常重要。 那么,让我们从错误演示开始,我们需要将动态缓冲区大小发送到套接字流,这工作得很好。
当我们尝试发送多个大小大于 int myBufferSize = 18 * 1024;
的缓冲区时,就会发生此错误。 (这是一个指示值)。
示例代码:
byte[] bs = new byte[myBufferSize];
while (...){
fileInputStream.read(bs);
byte[] bufferToSend = new byte[sizeBuffer];
DataOutputStream dataOutputStream = new DataOutputStream(client.getoutputStream());
dataOutputStream.writeInt(bufferToSend.length);
dataOutputStream.write(bufferToSend);
dataOutputStream.flush();
}
错误描述:
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
broken pipe 是什么意思? 损坏的管道意味着一台机器正在尝试向管道写入数据或从管道读取数据,而管道另一侧的机器已终止。
由于连接已终止,因此必须建立任何新连接来传输数据。 否则,数据传输将停止。
请记住,Java 没有特别的 BrokenPipeException。
这种错误显然会包含在不同的异常中,例如 IOException 和 SocketException。 在我们的例子中,损坏的管道被包裹在 SocketException 中。
为什么我们会遇到这个问题,以及如何解决这个问题? 下一节给出了一些常见原因。
Java 中出现 java.net.SocketException: Broken pipeline 错误的原因
如果发生以下任何情况,我们可能会遇到此错误。
- 当多个客户端连接到一台服务器并且多个客户端在响应完全提供/传输之前关闭其连接时,会间歇性地发生此错误。
- 大多数时候,当我们写入另一端已经关闭的连接时,就会发生这种情况。
- 当对等方关闭连接而不读取整个数据(在其端挂起)时,也可能会发生这种情况。 在另一种情况下,对等方会故意采取重置操作,而不是正确关闭连接。
- 用户在页面完全加载之前关闭浏览器,这会导致服务器的客户端会话意外断开。
- 或者用户在当前页面完全加载之前导航到另一个页面。
- 当加载时互联网连接失败时,我们也会收到此错误。
- 此错误的另一种情况是浏览器因请求连接已完成而导致连接超时。 大多数情况下,当我们尝试上传大量资源时会发生这种情况。
消除 Java 中的 java.net.SocketException: Broken pipeline 错误的可能解决方案
在进行客户端-服务器编程时,我们可以采取多种方法来消除此错误。 我们是否要忽略或处理根本原因以让开发人员知道?
- 一般来说,服务器应用程序处理此类错误是必要的,这样我们的服务器就不会受到其他客户端的影响。 是的,作为支持人员,我们可以忽略它,因为在数据/响应完全传输之前客户端已经断开连接。
- 如果在上传大量资源时发生错误,我们必须使我们的 API 具有较长的请求超时时间。
-
有时,端口扫描器通过打开连接并立即关闭它来完成工作。 我们的服务器没有编程来处理连接失败。
这是因为我们没有针对这种情况编写代码。 这里,我们需要使用try-catch来处理这种情况。
-
Broken pipeline 问题位于另一侧,而不是代码中。 另一端(可以是客户端或服务器)可能不理解我们的长度字协议。
例如,没有正确实施。 如果它与此代码类似(在错误演示中提供),则不会。
我们忽略
read()
返回的响应。 此外,假设它填满了缓冲区; 没有指定这样做,仅发送/传输一个字节。 -
另一种解决方案是检查发生输入/输出异常的代码,并用 try-catch 块包装该代码以捕获 IOException。 然后,由我们决定如何处理这个半有效的场景。
请记住,这种情况仅适用于损坏的管道包裹在 IOException 周围的情况。
相关文章
Java 错误 Java.Security.InvalidKeyException: Illegal Key Size
发布时间:2023/07/15 浏览次数:98 分类:Java
-
本篇文章介绍包含 java.security.InvalidKeyException: Illegal key size 的 Java 代码。 然后,我们将了解其可能的原因。最后,它通过消除指定的错误来引导我们找到解决方案。
Java 错误 Java.SQL.SQLException: Access Denied for User Root@Localhost
发布时间:2023/07/15 浏览次数:71 分类:Java
-
本篇文章介绍如何解决 Java 中的 java.sql.SQLException: Access Denied for user 'root'@'localhost' 错误。修复 Java 中的 java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
Java 异常 Java.Lang.ClassNotFoundeException: Sun.Jdbc.Odbc.JdbcOdbcDriver
发布时间:2023/07/15 浏览次数:105 分类:Java
-
本篇文章介绍了 Java 中的 java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver 错误。修复 Java 中的 java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
Java 错误 Gateway Process Exited Before Sending Its Port Number
发布时间:2023/07/15 浏览次数:104 分类:Java
-
本篇文章介绍了 Java 中 Java gateway process exited before sending the driver its port number 错误 Java gateway process exited before sending the driver its port number 错误
修复 Java 中 Java.Net.BindException: Address Already in Use: Bind 错误
发布时间:2023/07/15 浏览次数:76 分类:Java
-
本篇文章介绍了 Java 中的 java.net.BindException:Address already in use: Bind 错误。修复Java 中的 java.net.BindException:Address already in use: Bind
Java 中 Re-Throw Exception 异常
发布时间:2023/07/15 浏览次数:61 分类:Java
-
在Java中,throw是最常用的关键字,用于抛出内置异常或用户定义的异常,但有时我们必须通过catch块抛出相同的异常。
使用 Java 连接 FTPS 服务器
发布时间:2023/07/14 浏览次数:76 分类:Java
-
安全文件传输协议 (FTPS) 是文件传输协议 (FTP) 的安全版本,它使用 SSL/TLS 加密来保护客户端和服务器之间传输的数据。 本文将介绍如何使用 Java 安全通道 (JSSE) API 连接到 Java 中的 FTPS 服务器。
使用 Java 创建 X.509 证书
发布时间:2023/07/14 浏览次数:107 分类:Java
-
X.509 是一种广泛使用的公钥基础设施 (PKI) 标准,用于保护和验证互联网上的交易。本文将教我们如何使用 Java 创建 X.509 证书。
Java 中错误 Unsupported Major Minor Version
发布时间:2023/07/14 浏览次数:68 分类:Java
-
出现 Unsupported Major.minor version 错误或 Java.lang.UnsupportedClassVersionError 的原因是运行时 JDK 较低,编译时 JDK 较高。 本篇文章介绍如何解决Java中不支持的major.minor版本。