[英]Why a “java.net.SocketException: Broken pipe” will occur?
我写了一个简单的套接字程序,它工作正常,但我的朋友使用端口扫描工具,当它扫描到我正在使用的端口时,它用“java.net.SocketException:Broken pipe”错误,发生了什么事? 以及如何解决?
providerSocket = new ServerSocket(portNum);
connection = providerSocket.accept();
if (connection.getOutputStream() != null) {
//this line crash!!!
out = new ObjectOutputStream(connection.getOutputStream());
out.flush();
}
控制台的详细错误:
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.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1847)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1756)
at java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:230)
某些端口扫描程序通过开始打开连接然后立即终止它来工作。 您的服务器未编程为处理连接失败,因为您没有为此可能性编码。 您将需要使用try / catch来捕获该条件并进行恢复。 此外,您可能应该将连接切换到单独的线程进行处理,因此您的主程序可以继续接收新连接(并将它们发送到要处理的线程)。
我认为当远程端关闭连接时会发生这种情况;
你问题的原因可能在这里:
JavaDoc的:
传入连接指示(连接请求)的最大队列长度设置为50.如果在队列已满时到达连接指示,则拒绝连接。
例如,您应该增加ServerSocket的“backlog”参数
int backlogSize = 50 ;
providerSocket = new ServerSocket(portNum, backlogSize);
要么使用带有SocketException和IOException的throws子句,要么最后按照我朋友的建议放入try catch。最后不要忘记关闭你正在使用的所有流。并检查你的端口号在客户端和服务器端程序.Hopw这将有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.