Если вы спрашиваете, возможно ли определить, прежде чем вызывать чтение в сетевом сокете, сколько байтов доступно для чтения, короткий ответ - нет.Вы можете только определить, есть ли какие-либо байты, доступные для чтения, но не число байтов.У клиента также могут быть байты, записанные в его ядро, но заблокированные полными буферами сервера, поэтому сам сервер может не знать, сколько байтов готово для чтения.Кроме того, со стороны клиента нет способа узнать, сколько данных было записано клиентом, но не использовано сервером.
Данные буферизуются как на стороне клиента, так и на стороне сервера, нов Java нет способа увидеть, сколько байтов в этих буферах.Вы могли бы получить его с помощью некоторых очень специфических вызовов ядра в C, но это было бы очень непереносимо.
- Одна вещь, на которую следует обратить внимание, это использовать
Socket.setKeepAlive(true)
, который будет использовать механизмы TCP для сохранениярозетка жива.Я не уверен, насколько это надежно со стороны сервера, но он должен получить -1 из чтения, когда сокет истекает после того, как клиент уходит. - Другой способ - создать отдельное TCP-соединение длякаждый пинг.Если это слишком дорого, то вы можете восстановить соединение после определенного количества попыток проверки связи.
- Третья вещь, которую следует учитывать, - это отправка UDP-пакетов от клиента, которые не будут буферизироваться и стоят намного дешевле.Вы должны отправлять чаще, поскольку также нет повторных попыток.
- Сервер также может отправить какой-то ответ, чтобы клиент знал, что клиент знает, что сокет все еще исправен.Он может восстановить соединение, если не получит ответ.