2012-03-02 41 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);