Сокеты Java: лучший способ повторить попытку исключения «Отказано в соединении»? - PullRequest
2 голосов
/ 20 июня 2011

Прямо сейчас я делаю это:

while (true) {
    try {
        SocketAddress sockaddr = new InetSocketAddress(ivDestIP, ivDestPort);
        downloadSock = new Socket();
        downloadSock.connect(sockaddr);
        this.oos = new ObjectOutputStream(downloadSock.getOutputStream());
        this.ois = new ObjectInputStream(downloadSock.getInputStream());
        break;
    } catch (Exception e) {}
}

downloadSock.connect(sockaddr) сгенерирует исключение ConnectionRefused, если удаленный хост не прослушивает сокет.Я запускаю свой код в отдельном потоке, поэтому я не беспокоюсь о блокировке.Учитывая это, мой метод повторной попытки подходит или есть лучший способ ???

Спасибо!

Ответы [ 3 ]

4 голосов
/ 20 июня 2011

Можно попытаться подключиться к удаленному серверу в цикле, и на самом деле это очень распространено, но убедитесь, что в каждой итерации есть Thread.sleep(ms), или хост сервера может подумать, что вы пытаетесь DOS .

2 голосов
/ 20 июня 2011

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

Возможно, сервер почти запущен, поэтому вы можете просто повторить попытку через секунду.Но если этот запрос не удался, подождите 2 секунды, но если этот запрос не сработал, подождите 4 и т. Д.

Возможно, вы захотите ограничить количество ожидания до 30 секунд или минуты или что-то в этом роде.Вероятно, разумно определить максимальное количество попыток, чтобы не просто ждать бесконечно.

Примерно так может рассчитаться ваша следующая задержка в секундах:

seconds_to_wait = Math.min(60, Math.pow(2, try_num));
1 голос
/ 20 июня 2011

Ваш метод будет забивать сервер запросами на подключение один за другим. Вы должны включить вызов Thread.sleep() в свой блок catch (чтобы он выполнялся только в том случае, если вам действительно нужно ждать), чтобы подождать пару секунд, прежде чем попытаться снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...