2011-04-26 157 views
5

嗨 我正在構建一個小的p2p程序,實現了服務器端和客戶端。 當我午餐客戶端程序時,首先想到的是連接到其列表中的每個服務器,發送數據(關於客戶端)並斷開連接。客戶端下一次連接到其中一臺服務器時,它將被識別。從java中斷開連接

我的問題 - 當我告訴客戶端斷開連接,我得到這個例外

java.io.EOFException 
at java.io.DataInputStream.readUnsignedShort(Unknown Source) 
at java.io.DataInputStream.readUTF(Unknown Source) 
at java.io.DataInputStream.readUTF(Unknown Source) 
at oop.ex3.nameserver.NameServerThread.run(NameServerThread.java:24) 

斷開我只是寫:

finally { 
     out.close(); 
     in.close(); 
     socket.close(); 
    } 

那麼,如何避免此異常?謝謝!

+0

呃之前做了刷新,你有沒有想過,如果任何個人'接近()'語句拋出一個異常,會發生什麼? – 2011-04-26 16:59:35

回答

10

爲Socket.close的JavaDoc的()中明確規定:

關閉此套接字也將關閉 套接字的InputStream和OutputStream的 。

這將拋出異常,因爲你已經關閉它們!

0

當您關閉客戶端時,您希望在服務器端發生什麼?

爲避免此異常,您需要實現您自己的readUnsignedShort()方法。

public int readUnsignedShort() { 
    int ch1 = in.read(); 
    int ch2 = in.read(); 
    if ((ch1 | ch2) < 0) 
//  don't throw new EOFException(); 
     return -1; // EOF marker. 

    return (ch1 << 8) + (ch2 << 0); 
} 
0

難道是正確的關閉輸出流?:

finally { 
    //this is the DataOutputStream 
    if(dout != null){ 
     dout.flush(); 
     dout.close(); 
    } 
    //and this the OutputStream 
    if(out != null){ 
     out.flush(); 
     out.close(); 
    } 
    if (din != null){ 
     din.close(); 
    } 
    if (in != null){ 
     in.close(); 
    } 
    if (socket != null){ 
     socket.close(); 
    } 
}