У меня была такая же проблема с SocketChannel. Я использовал библиотеку на основе SocketChannel для подключения к websocket из приложения andoird (библиотека Autobahn websocket). Я могу успешно подключиться к веб-соке и отправлять/получать сообщения через websocket. Но через некоторое время (может быть, через 30 минут, 1 или 2 часа) соединение веб-сокета зависает. Как ваш сценарий, журналы показывают, что соединение сокета все еще открыто и подключается к серверу, сообщение уже успешно записывается. Но сервер не получит сообщения.
В моем сценарии проблема не с SocketChannel. Проблема заключается в отключении TCP. Чтобы поддерживать связь в сети, я отправляю сообщение с периидического пинга от сервера к клиенту. Веб-сокет по умолчанию поддерживает это сообщение PING/PONG сообщений. Это сообщение ping должно быть отправлено клиентам в периодическом режиме, чтобы сохранить соединение в сети. Когда сообщение ping получает клиент автоматически отвечает PONG сообщение серверу. Используя этот подход, я смог сохранить соединение сокета в течение длительного времени.
Более подробная информации об этом подходе Solution for websocket hanging, Websockets. Loss of internet, keep-alive messages, app architecture etc, websocket protocol and ping/pong messages
Надеется, что это поможет вам (даже если вы не используете WebSocket). Такой подход может быть таким же, как в websocket, так и в приложении для чата.
У меня такая же проблема, и я не нашел решения. Я искал 6 месяцев. – Joel