2013-10-06 1 views
1

сниппет Server:BufferedReader Readline обнаружить закрытую розетку и использовать .ready()

reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(connection.getInputStream()))); 
if (reader.ready()) { 
    result = reader.readLine(); 
    if (result == null) { 
     quit(); // handle closing the socket 
    } else { 
     // process result 
    } 
} 

Client сниппет:

BufferedOutputStream os = new BufferedOutputStream(connection.getOutputStream()); 
OutputStreamWriter osw = new OutputStreamWriter(os, "US-ASCII"); 
osw.write("hello\n"); 
osw.flush(); 

Проблема:

Когда клиент что-то пишет на сервере, то считывается правильно, но когда клиент закрывает свою розетку (например, принудительное завершение программы), reader.readLine() должен выводить null, из-за if (reader.ready()) { нулевой результат никогда не достигнет quit(). , если я ухожу if (reader.ready()) {, сервер не может читать данные.

Как исправить это?

EDIT: я не могу использовать while ((result = reader.readLine()) != null) { потому, что мне нужно работать больше кода после того, как это:

while (running) { 
    try { 
    reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(connection.getInputStream()))); 
    if (reader.ready()) { 
     result = reader.readLine(); 
     if (result == null) quit(); 
     else // process result 
    } 
    catch (Exception e) { ... } 

    // more code 
    } 
} 

ответ

0

Я решил это сам, запустив этот кусок кода каждые 5 секунд:

try { 
      BufferedOutputStream os = new BufferedOutputStream(thread_cnn.getOutputStream()); 
      OutputStreamWriter osw = new OutputStreamWriter(os, "US-ASCII"); 
      osw.write("areyoustillthere\n"); 
      osw.flush(); 

} catch (Exception e) { 
      quit(); // handle quit if server can't reach client 
} 
0

Просто удалите готовый() тест. Это так просто. ready() не является испытанием для конца потока. readLine() будет блокироваться, пока нет данных.

И вы должны создать BufferedReader один раз, вне цикла чтения. В противном случае вы потеряете данные.

+0

Я не хочу Readline блокировать, пока это не данные (далее код не будет выполняться до тех пор, пока данные), поэтому у меня есть тест 'ready()'. – Laurent

+0

Тогда вы никогда не сможете обнаружить конец потока. Но поскольку у вас даже нет «else» для теста «if reader.ready()», вы не можете поверить в свое утверждение. Я думаю, вы что-то неправильно поняли. – EJP