Для чего обычно используют сокеты?
Что проверяют
Понимаете ли вы, когда нужен постоянный двусторонний канал вместо обычных HTTP-запросов и как такое соединение живёт на Android с его ограничениями фоновой работы. Следом обычно спрашивают, чем WebSocket отличается от TCP-сокета и что делать при обрыве связи.
Как отвечать
Сокет это конечная точка сетевого соединения. HTTP-запрос тоже идёт через сокет, но свой долгоживущий сокет держат, когда сервер должен присылать данные сам, без запроса клиента:
- чаты в открытом приложении: новые сообщения и статус «печатает»;
- котировки, трекинг курьера, онлайн-игры: частые мелкие обновления. Для игр и голоса часто берут UDP, где потерять пакет лучше, чем ждать его повтора;
- локальная сеть и устройства: принтеры, умный дом, связь с железом по Wi-Fi.
На Android это обычно не голый java.net.Socket, а WebSocket через OkHttp (newWebSocket и WebSocketListener) или Ktor-клиент. Низкоуровневые Socket, ServerSocket и DatagramSocket нужны для своих бинарных протоколов и работы с устройствами.
Обязательная обвязка: сеть не на главном потоке (иначе NetworkOnMainThreadException), корутины на Dispatchers.IO; wss:// вместо ws://; pingInterval, чтобы заметить мёртвое соединение; переподключение с экспоненциальной задержкой и реакция на смену сети через ConnectivityManager.NetworkCallback. Держать соединение лучше в репозитории, а не в Activity.
Где спотыкаются
Пытаются держать сокет в фоне ради уведомлений. Doze и ограничения фоновой работы всё равно его оборвут, для доставки в фоне есть FCM.
Путают WebSocket и Socket.IO. Socket.IO это свой протокол поверх транспорта, обычный WebSocket-клиент к такому серверу не подключится.
Открывают соединение во фрагменте или Activity и получают переподключение при каждом повороте экрана, утечку слушателя и дубли сообщений.