Что такое WebSocket и в каких сценариях его использовать
Что проверяют
Понимаете ли вы, чем постоянное соединение отличается от модели запрос и ответ, и умеете ли жить с ним на телефоне, где сеть пропадает, а приложение уходит в фон. Следом спрашивают про переподключение и работу в фоне.
Как отвечать
WebSocket это протокол (RFC 6455) полнодуплексного обмена сообщениями поверх одного TCP-соединения. Он начинается с обычного HTTP-запроса с заголовками Upgrade: websocket и Sec-WebSocket-Key, сервер отвечает 101 Switching Protocols, и дальше обе стороны шлют текстовые или бинарные фреймы когда угодно. В продакшене только wss:// поверх TLS.
Когда он нужен:
- чаты и совместная работа: сообщения, статус «печатает», присутствие;
- котировки, трекинг курьера, счёт матча: частые мелкие обновления в реальном времени;
- игры и удалённое управление, где важна задержка в обе стороны.
Когда не нужен: редкие события лучше отдать пушам через FCM, однонаправленный поток с сервера закрывается SSE, а данные раз в минуту спокойно берутся обычным запросом.
В Android стандартный выбор это OkHttp: client.newWebSocket(request, listener) и колбэки onOpen, onMessage, onClosing, onClosed, onFailure. Пинги включаются через pingInterval в OkHttpClient.Builder. Колбэки OkHttp удобно обернуть в callbackFlow, есть и Ktor Client с плагином WebSockets. Соединение привязывают к жизненному циклу: открывают в репозитории или ViewModel, закрывают при уходе приложения в фон (ProcessLifecycleOwner), переподключаются с экспоненциальной задержкой и следят за сетью через ConnectivityManager.NetworkCallback. После переподключения клиент дозапрашивает пропущенное, например по id последнего сообщения.
Где спотыкаются
Держат сокет в фоне ради «мгновенных» уведомлений. Doze всё равно его оборвёт, а батарея пострадает. Для фона есть пуши.
Обновляют UI прямо из onMessage. Колбэки OkHttp приходят на фоновом потоке, данные надо отдавать в Flow или StateFlow и собирать на главном.
Не обрабатывают onFailure и не переподключаются. На мобильной сети соединение рвётся при каждом переходе с Wi-Fi на LTE, и без переподключения чат молча перестаёт получать сообщения.