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)

чтобы увидеть, поможет ли это вашей ситуации.

Другие вопросы по тегам