В моем приложении есть компонент, который слушает сервер через TCP (поэтому он только получает данные, поток вывода никогда не используется). Единственная причина потенциального отключения — технические проблемы. С логической точки зрения соединение должно оставаться открытым навсегда.
Я знаю, что мне нужно реализовать какую-то стратегию ping/pong, если я хочу обнаружить сбой соединения немедленно. Но в моем случае нет необходимости сразу обнаруживать обрыв соединения, если оно вообще обнаруживается (скажем, через несколько минут или часов).
Мои вопросы:
- Если я не использую какую-то стратегию pingpong/alive-check и соединение обрывается, получу ли я IOException в логике своего приложения через некоторое время (все будет хорошо, если это займет несколько часов) или возможно, что обрыв соединение вообще не определяется?
- Будет ли приведенный ниже код соответствовать моим требованиям? Это немного некрасиво (многие пытаются поймать/пока(true) и даже спать, но мне интересно, можно ли распознать соединение с истекшим временем ожидания через определенное время (например, из-за IOException в блокирующем методе BufferedReader.readLine ).
Помимо вопросов выше, что я мог бы сделать лучше?
public class Receiver implements Runnable { private Socket socket; private final String host; private final int port; private final int connectionRetryAfter = 10* 1000; public Receiver(String host, int port) { // assignments... } @Override public void run() { tryCreateSocket(); listenToServer(); } private void listenToServer() { String receivedLine; BufferedReader buf; while(true) { try { buf = new BufferedReader(new InputStreamReader(socket.getInputStream())); while ((receivedLine = buf.readLine()) != null) { // do something with 'inputLine' } } catch (IOException e) { // logging } finally { closeSocket(); } // At this point, either an exception occured or the stream equals null (which means it's closed?) tryCreateSocket(); } } private void tryCreateSocket() { try { socket = new Socket(host, port); } catch (IOException e) { // logging try { Thread.sleep(connectionRetryAfter); } catch(InterruptedException ex) { // logging Thread.currentThread().interrupt(); } // retry tryCreateSocket(); } } private void closeSocket() { if (socket != null) { try { socket.close(); } catch (IOException e) { // logging } } }
}