Недавно я столкнулся с той же проблемой и пришел к выводу, что самым чистым решением будет отправка «пустых» TCP-пакетов, то есть пакетов с длиной полезной нагрузки 0. Это приведет к тому, что стек TCP другого конца будет просто отправьте ACK, не уведомляя приложение на другой стороне, что снова позволяет локальному стеку TCP определить, живо ли соединение.
К сожалению, Java (Sun / Oracle SDK) не предоставляет никаких средств для отправки пустых пакетов; write(new byte[0]);
не будет работать.
В моем случае я, кажется, нашел возможное решение:
sendUrgentData () может использоваться для передачи одного байта «срочных» или «внеполосных» данных . Этот тип TCP-пакета просто игнорируется программным обеспечением моего партнера, поэтому не мешает другим «нормальным» данным в соединении и позволяет моему локальному стеку TCP обнаруживать сбой соединения.
Учитывая, что данные "OOB" редко когда-либо используются, а иногда реализуются только наполовину - как в Java - кажется вероятным, что использование этого "трюка" не помешает большинству приложений.
Я не придерживался этого подхода, кроме простого тестирования (в конце использовался другой способ «сохранить жизнь»), но он может помочь вам решить вашу проблему. Это определенно стоит попробовать.