2012-03-02 38 views
7

我写了一个简单的套接字程序,它工作正常,但我的朋友使用端口扫描工具,当它扫描到我使用的端口时,它与“java.net.SocketException:Broken pipe”错误现金,会发生什么?以及如何解决它?从控制台为什么会出现“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。测试毫无意义。 – EJP 2012-03-02 04:58:16

回答

7

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

2

我认为这发生在远端关闭连接时;

-1

或者抛出带有SocketException和IOException异常的子句,或者像上面我的朋友建议的那样放上try catch。最后不要忘记关闭所有正在使用的流。并且还要检查客户端和服务器端程序的端口号。 Hopw这将有所帮助。

0

您的问题的原因可能是这里:

的JavaDoc:

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

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

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