【问题标题】:Why a "java.net.SocketException: Broken pipe" will occur?为什么会出现“java.net.SocketException: Broken pipe”?
【发布时间】:2012-03-02 04:03:14
【问题描述】:

我写了一个简单的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)

【问题讨论】:

  • connection.getOutputStream() 不返回空值。测试毫无意义。

标签: java sockets


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我认为当远程端关闭连接时会发生这种情况;

    【讨论】:

      【解决方案3】:

      要么使用带有 SocketException 和 IOException 的 throws 子句,要么按照我朋友上面的建议将 try catch finally这会有所帮助。

      【讨论】:

        【解决方案4】:

        你的问题的原因可能在这里:

        JavaDoc:

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

        你应该增加你的ServerSocket的“backlog”参数,例如

        int backlogSize = 50 ;
        providerSocket = new ServerSocket(portNum, backlogSize);
        

        【讨论】:

          猜你喜欢
          • 2011-06-06
          • 1970-01-01
          • 1970-01-01
          • 2013-01-15
          • 1970-01-01
          • 2014-06-14
          • 2013-02-07
          • 2018-10-29
          相关资源
          最近更新 更多