TCP соединение отказано на Nexus 5X
У меня есть простое приложение, в котором я открываю соединение через сокет TCP с сервером, а затем отправляю через него некоторые данные. Это работает нормально, но я получаю следующее исключение на устройствах Nexus 5X. Так как я могу подключиться к серверу с другими устройствами, это не проблема на стороне сервера.
09:00:05.118+03:00 D/com.testing.android.util.Util getCurrentGatewayIP: 192.168.1.1
09:00:05.120+03:00 D/com.testing.android.util.TCPClient Connect()
09:00:05.121+03:00 D/com.testing.android.util.TCPClient openSocket
09:00:17.162+03:00 E/com.testing.android.util.TCPClient sendInfo
09:00:17.163+03:00 E/com.testing.android.util.TCPClient java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
at java.net.Socket.connect(Socket.java:586)
at com.testing.android.util.TCPClient.openSocket(TCPClient.java:208)
at com.testing.android.util.TCPClient.connect(TCPClient.java:53)
at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
ОБНОВИТЬ:
Похоже, Nexus 5X блокирует доступ к серверу (который является частью локальной сети и подключается к телефону через Wi-Fi). Эта сеть не имеет подключения к интернету. На других устройствах Android вы получите уведомление "Wi-Fi не имеет доступа к Интернету - эта сеть не имеет доступа к Интернету. Оставайтесь на связи? (Да / Нет)", но вы все равно сможете общаться в локальной сети. На Nexus, если пользователь не согласен с тем, что он хочет оставаться на связи с сетью, все коммуникации блокируются.
2 ответа
В настоящее время нет программного решения этой проблемы. Пользователь должен разрешить сеть вручную. Так как это функция безопасности для обнаружения Captive Portals, только системные приложения могут отключить это.
Этот пост описывает немного больше деталей
Подключение осуществляется через встроенную функцию connect()
, man connect
говорит:
ECONNREFUSED Никто не слушает удаленный адрес.
Это означает, что вы должны проверить, что ваш сервер действительно доступен по указанному адресу и порту и может принимать новые подключения.