为什么会出现 "java.net.SocketException: Broken pipe" 错误?

8

我写了一个简单的socket程序,它运行良好,但是我的朋友使用了一个端口扫描工具,当它扫描到我正在使用的端口时,会出现"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)

1
connection.getOutputStream() 不会返回 null。这个测试是无意义的。 - user207421
4个回答

8

一些端口扫描器通过开始打开连接,然后立即终止它来工作。你的服务器没有编写处理连接失败的代码,因为你没有考虑到这种情况。你需要使用try/catch来捕获该条件并进行恢复。此外,你可能应该将连接交给一个单独的线程进行处理,这样你的主程序就可以继续接收新的连接(并将它们发送到线程中进行处理)。


2
我认为这种情况发生在远程端关闭了连接时;

0
你的问题可能出在这里:

JavaDoc:

传入连接请求的最大队列长度(即连接请求)设置为50。如果队列已满,当连接请求到达时,连接将被拒绝。

你应该增加ServerSocket的“backlog”参数,例如:
int backlogSize = 50 ;
providerSocket = new ServerSocket(portNum, backlogSize);

0
要么在使用SocketException和IOException时使用throws子句,要么像我上面的朋友建议的那样使用try catch finally结构。在finally中不要忘记关闭所有正在使用的流。还要检查客户端和服务器端程序中的端口号。希望这可以帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接