Проблема исключения соединения с сокетом Java (Тайм-аут соединения) - PullRequest
1 голос
/ 06 июня 2019

Немного предыстории:

У меня есть приложение для Android, которое использует соединение для передачи данных 3G или 4G.Но он также подключается к точке доступа Wi-Fi для передачи некоторых данных между устройством точки доступа и приложением.

Что я хочу сделать: создать сокет-соединение с этой точкой доступа Wi-Fi и отправлять / получать данные через этот сокет.

Я добавил следующий код, чтобы убедиться, что мы используем Wi-Fi-точку доступа Wi-Fi при создании сокета (в противном случае иногда он заканчивается подключением к данным):

android.net.wifi.WifiManager wm = (android.net.wifi.WifiManager) getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());

Это нормально,Тем не менее, я вижу проблемы при попытке подключения к адресу удаленного сервера.Вот код, который я использую:

InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
InetAddress localAddress = InetAddress.getByName(ip);
socket = new Socket(serverAddr,SERVERPORT,localAddress,0);

Я использую вызов сокета, который подключается к адресу удаленного сервера с локального адреса (адрес Wi-Fi-соединения, полученный как указано выше).Я устанавливаю локальный порт на 0, так как это позволит сокету выбирать любой локальный доступный порт.Однако, когда я делаю это, я все время получаю ошибку тайм-аута соединения.

java.net.ConnectException: failed to connect to /A.B.C.D (port 3003) from /A.B.C.E (port 48492): connect failed: ETIMEDOUT (Connection timed out)

Я уверен, что нет проблем с кодом сокета сервера, так как я могу подключиться к серверу, если я не использую локальный адрес.Приведенный ниже код всегда работает:

InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                socket = new Socket(serverAddr, SERVERPORT);

Однако я не могу использовать его всегда, потому что хочу, чтобы данные и Wi-Fi были включены одновременно, а приведенный выше код не гарантирует, что он всегда будет использовать подключение Wi-Fi для подключения.(на самом деле это редко работает)

Я также пытался вручную выполнить привязку к локальному IP-адресу Wi-Fi и некоторому случайному порту.а затем делать сокет подключения.Но это тоже не сработало.

Сначала я думал, что номер порта не закрывается должным образом, если я его использую один раз.Но потом я заметил, что эта проблема часто возникает, даже когда я впервые открываю приложение.Я даже пытался установить порт в 0 (эфемерный порт), чтобы убедиться, что он выбирает любой доступный порт.

Любые предложения.Если есть лучший способ решить эту проблему, пожалуйста, дайте мне знать.

Заранее спасибо.

1 Ответ

0 голосов
/ 16 июля 2019

Убедитесь, что смартфон и компьютер подключены к одному интернет-соединению!(т.е. смартфон может использовать 4G или собственную сеть, в то время как компьютер может быть подключен к Wi-Fi)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...