Отправка пакета Keep-Alive вручную с помощью сокетов - PullRequest
4 голосов
/ 13 июня 2011

У меня есть сокет под названием "clientSock". Он подключен и работает.

Я получаю данные, используя цикл в потоке следующим образом:

char[] inputChars = new char[1024];
int charsRead = 0;

    while (!stopNow) {

        try {

            if ((charsRead =  inputStream.read(inputChars)) != -1)
                {

                    System.out.println("Firing");
                    fire_dataRecieved(new String(inputChars, 0, charsRead)); //Fire event.
                }

            } catch (IOException e) {
                //CLIENT HAS DISCONNECTED...
                connectedClient.disconnect();
                stopNow();
            }
        }

Я думаю об отправке пакета "keep alive", просто отправив "# KEEP-ALIVE" на другой конец.

Я могу сделать это, используя sendStream.print("#KEEP-ALIVE"). Есть ли лучший способ сделать это? Если нет, есть ли эффективный способ проверить, получили ли вы пакет? Или что-то там, что позволяет вам проверить, жив ли другой конец? clientSock.setKeepAlive(true) не режет это для меня. Мне нужно проверить, жив ли другой конец по требованию.

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Я не уверен, что ваш вопрос здесь.
Если другой конец не работает на уровне сети, вы получите исключение при попытке чтения из входного потока.
Если на другом конце есть привязка порта, но существует проблема на уровне приложения, которая не позволяет приложению отвечать на запросы, тогда можно использовать ACK, как упомянуто JVestry.
Если ваша проблема заключается в том, что вам необходимо различать периодические сбои в сети и отключение серверного приложения.

1 голос
/ 13 июня 2011

Есть ли лучший способ сделать это?Если нет, есть ли эффективный способ проверить, получили ли вы пакет?Или что-то там, что позволяет вам проверить, жив ли другой конец?

Если есть проблема с соединением, стек TCP очень быстро сообщит вам, когда вы отправите свой собственный пакет поддержки активности,Он содержит метод проверки того, что пакеты поступили и в правильном порядке.

Теперь, если вы хотите получить явное подтверждение того, что ваш пакет был получен, другой конец должен отправить подтверждение обратно.ИМХО, это излишне, но это то, что вам нужно сделать.

Если вы не получите ответ в течение разумной задержки (более 10 секунд более чем достаточно) и если стек TCP не выдал какой-тоошибка означает, что прослушивающая сторона / приложение на другой стороне не выполняет свою работу.Проблема на уровне приложения, а не на уровне стека TCP.

...