2016-02-07 99 views
2

我編寫了一個簡單的Server來監聽客戶端,當客戶端連接時,它打開一個Datainputstream,讀取客戶端發送的所有數據(我的客戶端UTF數據)。EOFException使用readUTF的DataInputStream

這是ServerCode:

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    try {   
     ServerSocket ss = new ServerSocket(7000); 
     while(true){ 
     System.out.println("Il Server sta cercando Connessioni"); 
     Socket s = ss.accept(); 
     System.out.println("Il Server ha accettato un Client"); 

     Thread t2 = new Thread(new Runnable(){ 
      public void run(){    
        try { 
        while(true){ 
        DataInputStream dis = new DataInputStream(s.getInputStream()); 
        isAlreadyOpened = true;      
        System.out.println(dis.readUTF()); 
        } 

       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        isAlreadyOpened = false; 
       } 
      }   
     }); 
     if(!isAlreadyOpened){ 
     t2.start(); 
     } 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

這是很基本的,我的客戶是一個Andorid的應用程序在單擊按鈕時發送數據:

@Override 
public void onClick(View v) { 
    try { 
     DataOutputStream out = new DataOutputStream(s.getOutputStream()); 
     out.writeUTF("Testiamo sto socket"); 
     out.flush(); 
     out.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

一切都是完美的客戶端連接時到服務器。但是,當我點擊一次客戶端按鈕時,發送的數據會顯示在我的服務器日誌中,但在拋出異常後立即顯示。

Il Server sta cercando Connessioni 
Il Server ha accettato un Client 
Il Server sta cercando Connessioni 
Testiamo sto socket 
java.io.EOFException 
    at java.io.DataInputStream.readUnsignedShort(Unknown Source) 
    at java.io.DataInputStream.readUTF(Unknown Source) 
    at java.io.DataInputStream.readUTF(Unknown Source) 

從Oracle文檔中讀取這個異常被拋出<>。 但我該如何避免這種情況?

+1

您是否嘗試在if語句之前放置一個if語句,如'if(dis.readUTF()!= null){做這個東西}' – Briesanji

+0

是的,我已經嘗試過了。但它不起作用..它引發異常但是它不會一次打印數據。所以我認爲這比以前更糟糕...... –

+0

'while(true)...'語句效率不高,應該避免。 'EOFException'是文件異常結束。所以這意味着你做錯了事(也許讀不存在的東西)。 – xdevs23

回答

6

您正在發送一個字符串,然後關閉連接。你正在嘗試閱讀無限多的字符串。他們沒有被髮送。你得到的是預計EOFException.

這裏沒有問題要解決。如果您需要通過同一連接發送更多字符串,請不要在發送完畢後關閉它。

+2

哦謝謝你的答案..我沒有得到它。我以爲連接沒有關閉,因爲服務器端的一切都很好。問題是客戶端在刷新輸出流後關閉了套接字。我只是刪除dos.close()和一切工作..非常感謝 –