Да, это сердцебиение - лучший способ. Вам придется встроить его в протокол, который сервер и клиент используют для связи.
Самое простое решение состоит в том, чтобы клиент периодически отправлял данные, а сервер закрывал соединение, если он не получил никаких данных от клиента в определенный период времени. Это прекрасно работает для протоколов запросов / ответов, когда клиент отправляет запросы, а сервер отправляет ответы.
Например, вы можете использовать следующую схему:
Сервер отвечает на каждый запрос. Если сервер не получает запрос в течение двух минут, он закрывает соединение.
Клиент отправляет запросы и сохраняет соединение открытым после каждого.
Если клиент не отправил запрос в течение одной минуты, он отправляет запрос «Ты здесь». Сервер отвечает «да, я есть». Это сбрасывает двухминутный таймер сервера и подтверждает клиенту, что соединение все еще доступно.
Может быть проще просто заставить клиента закрыть соединение, если ему не нужно было отправлять запрос в течение последней минуты. Поскольку все операции инициируются клиентом, он всегда может просто открыть новое соединение, если ему необходимо выполнить новую операцию. Это сводит его к следующему:
Сервер закрывает соединение, если не получил запрос в течение двух минут.
Клиент закрывает соединение, если ему не нужно отправлять запрос в течение одной минуты.
Однако это не гарантирует клиенту, что сервер присутствует и всегда готов принять запрос. Если вам нужна эта возможность, вам нужно будет ввести запрос / ответ «да, я» в ваш протокол.