сниппет 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
}
}
Я не хочу Readline блокировать, пока это не данные (далее код не будет выполняться до тех пор, пока данные), поэтому у меня есть тест 'ready()'. – Laurent
Тогда вы никогда не сможете обнаружить конец потока. Но поскольку у вас даже нет «else» для теста «if reader.ready()», вы не можете поверить в свое утверждение. Я думаю, вы что-то неправильно поняли. – EJP