2016-02-07 8 views
2

Я закодировал простой сервер, который прослушивает клиент и когда клиент подключен, открывает Datainputstream, который считывает все данные, отправленные с клиента (мои клиентские данные UTF).EOFException DataInputStream с использованием readUTF

Это 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 перед readuTF как 'if (dis.readUTF()! = Null) {do the stuff}' – Briesanji

+0

Да, я попробовал. Но это не сработает .. он выдает исключение, но он не печатает ни один раз данные. Поэтому я думаю, что это хуже, чем раньше. –

+0

'while (true) ...' заявления неэффективны и их следует избегать. 'EOFException' - это исключение из файла. Таким образом, это означает, что вы делаете что-то неправильно (возможно, чтение материала, которого не существует). – xdevs23

ответ

6

Вы отправляете одну строку и затем закрываете соединение. Вы пытаетесь читать бесконечно много строк. Они не отправляются. Вместо этого вы получаете EOFException.

Здесь нет проблем. Если вам нужно отправить больше строк по одному и тому же соединению, не закрывайте его после отправки.

+2

О, спасибо за ответ .. я не понял. Я думал, что соединение не было закрыто beacause Server side все хорошо. Проблема заключалась в том, что клиент после промывки выходного потока закрыл сокет. Я просто удалил dos.close(), и все сработало .. Большое спасибо –