#android
#Android
Вопрос:
У меня проблема с созданием сокета. Ошибка заключается в следующем
java.net.ConnectException: не удалось подключиться к / 192.168.1.103 (порт 23): сбой подключения: ENETUNREACH (сеть недоступна)
Вот часть моего кода
WifiConfiguration wifiConfiguration = new WifiConfiguration();
wifiConfiguration.SSID = """ wifiName """;
wifiConfiguration.preSharedKey = """ password """;
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
int networkId = wifiManager.addNetwork(wifiConfiguration);
if (networkId != -1)
{
wifiManager.enableNetwork(networkId, true);
new Thread(new GetMacThread()).start();
}
class GetMacThread implements Runnable{
private Socket socket;
private int portNumber = 23;
private String myIP = "192.168.1.103";
@Override
public void run()
{
try {
socket = new Socket(myIP, portNumber);
System.out.println("Socket Thread:" socket);
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
Я почти уверен, что это не проблема с сетью (IP и порт в порядке, я также добавил разрешения в манифест), потому что я протестировал его с подключенной сетью Wi-Fi, и прокомментированная строка wifiManager.enableNetwork(networkId, true)
и сокет были выполнены правильно. Тогда программа работала. Итак, проблема в том, что он работает только с ранее включенным Wi-Fi.
Я также попытался сначала проверить соединение Wi-Fi с помощью ConnectivityManager перед созданием сокета, но это ничего не изменило.
Есть ли у вас какие-либо идеи, почему сокет выходит из строя в этом конкретном порядке?
Комментарии:
1. Вероятно, я нашел решение. Android не удалось создать сокет, потому что для подключения к Wi-Fi требуется больше времени, а ConnectivityManager проверяет, включен ли Wi-Fi (проверка того, включен ли Wi-Fi, это не обязательно означает, что он подключен). Поэтому я использовал широковещательный приемник, чтобы проверить, было ли установлено соединение.
2. Ваше решение дало мне отличную подсказку о том, что пошло не так в моем собственном проекте, поэтому я решил это. Спасибо!
Ответ №1:
Метод ConnectivityManager.bindProcessToNetwork() помог мне в аналогичном случае. Дополнительную информацию вы можете найти здесь — https://android-developers.googleblog.com/2016/07/connecting-your-app-to-wi-fi-device.html .