Android tcp socket устанавливает значение etimedout
У меня есть клиент сокета TCP на Android. Также у меня есть сервер сокетов tcp на nodejs, который отправляет тестовое сообщение подключенному клиенту каждые 2 секунды. Когда я запускаю приложение, оно получает тестовые сообщения с сервера. Но когда я отключаю соединение Wi-Fi, мой клиентский сокет закрывается и выдает SocketException (etimedout), и если я включаю Wi-Fi, я не могу получать сообщения от сервера. Но сообщения сервера уже поставлены в очередь на сервере и ждут отправки клиенту.
Как я знаю, если клиент TCP потеряет соединение, он должен попытаться восстановить соединение и получить сообщения от сервера. Но в моем случае клиент не может получать сообщения, потому что сокет закрыт.
С клиентом Windows и Linux-сокетом на моем компьютере я делаю то же самое, но когда я выключаю Wi-Fi, клиентский сокет не закрывается, и когда я включаю Wi-Fi, я получаю сообщения, которые отправлены, когда Wi-Fi -fi отключен.
Вопрос: почему в андроиде сокет закрывается в кратчайшие сроки? Могу ли я установить таймаут для закрытия сокет-клиента?
Я старался:
setKeepAlive(true); setSoTimeout(10000);
Пытался использовать SocketFactory.getDefault().createSocket();
Нет эффекта.
2 ответа
Но когда я отключаю соединение Wi-Fi, мой клиентский сокет закрывается и выдает SocketException
Ваша розетка не закрывается. Есть проблемы с входным потоком сокета, когда WiFi выключается. Возвращает -1, но сокет жив.
На что настроен ваш SoLinger?
Попробуйте использовать
setSoLinger(boolean on, int timeout)
чтобы увидеть, поможет ли это вашей ситуации.