Как подключиться к моему веб-серверу http://localhost из эмулятора Android в Eclipse

Что я могу сделать в Android-эмуляторе Eclipse, чтобы подключить его к странице моего локального веб-сервера по адресу http://localhost или же http://127.0.0.1?

Я пробовал это сделать, но эмулятор по-прежнему принимает мой запрос, как поиск в Google для localhost или, что еще хуже, он говорит, что не нашел страницу, когда мой веб-сервер нормально работает.

20 ответов

Решение

Локальный хост относится к устройству, на котором выполняется код, в данном случае к эмулятору.

Если вы хотите обратиться к компьютеру, на котором работает симулятор Android, используйте вместо этого IP-адрес 10.0.2.2. Вы можете прочитать больше здесь.

Использование 10.0.2.2 по умолчанию AVD и 10.0.3.2 за гениальное движение

Я успешно использовал 10.0.2.2 на своем домашнем компьютере, но на работе он не работал. После нескольких часов дурачения я создал новый экземпляр эмулятора с помощью диспетчера виртуальных устройств Android (AVD), и, наконец, 10.0.2.2 заработал.

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

Вы действительно можете использовать localhost:8000 для подключения к локальному хосту вашего компьютера, каждый раз выполняя команду ниже при запуске эмулятора (проверено только на Mac):

adb reverse tcp:8000 tcp:8000

Просто поместите его в терминал Android Studio.

По сути, он устанавливает обратный прокси-сервер, в котором http-сервер, работающий на вашем телефоне, принимает соединения через порт и подключает их к вашему компьютеру или наоборот.

Пытаться http://10.0.2.2:8080/ где 8080 это номер вашего порта. Это сработало отлично. Если вы просто попробуете 10.0.2.2 это не сработает. Вам нужно добавить номер порта к нему. Также, если Microsoft IIS был установлен, попробуйте отключить эту функцию с панели управления (при использовании Windows OS), а затем попробуйте, как указано выше.

Согласно документации:

10.0.2.2 - Специальный псевдоним интерфейса обратной связи вашего хоста (т. Е. 127.0.0.1 на вашей машине разработки)

проверьте сеть эмулятора для получения дополнительной информации об эмуляции сети.

Для устройства My Mac OS Mountain Lion:

http: // 10.0.2.2:8888

Работает отлично!

Несмотря на то, что я прочитал все ответы здесь и в других местах, я потерял несколько часов, пытаясь отладить эту проблему, поскольку адрес10.0.2.2не работало даже в браузере Chrome. Если то же самое происходит с вами, вот пошаговое руководство, чтобы попытаться отладить и, надеюсь, решить вашу проблему.

Проверьте шлюз эмулятора 10.0.2.2.

Внутри эмулируемого Android перейдите в «Настройки»> «Wi-Fi», проверьте, подключен ли он к точке доступа AndroidWiFi (которая представляет ваш хост-компьютер), а затем нажмите «Дополнительно» внизу, затем проверьте адрес шлюза: он должен указывать на 10.0.2.2. Если нет, то у вас есть другая проблема, возможно, изменение настроек прокси может решить вашу проблему, см. здесь, как это сделать с Android Studio с 2022 года, поскольку настройка прокси теперь скрыта: Как настроить прокси в эмуляторах в новых версиях Android Студия?

Проверьте, доступен ли ваш сервер с вашего хост-компьютера.

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

Проверьте, доступен ли ваш сервер из эмулятора

Откройте браузер Chrome и укажите его (для genymotion замените наhttp://10.0.3.2:<port>). Если ваше веб-приложение появится, отлично, все готово. Если нет, проверьте другие шаги ниже, чтобы точно определить основную проблему.

Протестируйте с другим сервером

Если к вашему веб-приложению можно получить доступ с вашего хост-компьютера, но не внутри эмулятора, основной причиной может быть то, что ваш локальный сервер по какой-то причине ограничивает доступ к некоторым интерфейсам, вероятно, из соображений безопасности.

Чтобы проверить это, попробуйте использовать другой сервер, подойдет простой HTTP-сервер, напримерhttp-serverсnodejs, илиpython -m http.server 8000с питоном 3.

Затем попробуйте получить доступ к этому простому серверу из браузера Chrome вашего эмулятора, например,http://10.0.2.2:8000. Если это работает, то это подтверждает, что ваш локальный сервер ограничивает доступ к некоторым интерфейсам. Вам нужно прочитать документацию вашего локального сервера, чтобы расширить разрешения.

Например, в моем случае мой сервер былangular-cli(AngularJS), который по умолчанию ограничивает обслуживание только локальным хостом. Чтобы заставить его работать, мне пришлось использоватьng serve --disable-host-check --host 0.0.0.0вместо того, чтобы простоng serve, как предложено в этом другом вопросе. --host 0.0.0.0 указывает веб-серверу обслуживать все интерфейсы. Подобные аргументы могут быть предоставлены большинству веб-серверов.

Альтернативой может быть отключение некоторых неиспользуемых адаптеров, особенно виртуальных, таких как VPN.

Разрешения вашего приложения Android для открытого текста

Теперь ваше веб-приложение должно быть доступно внутри эмулятора с помощью приложения Chrome с URL-адресомhttp://10.0.2.2:<port>. Последней частью головоломки является добавление разрешений в ваше Android-приложение для доступа к 10.0.2.2 и особенно открытому тексту, если ваш локальный веб-сервер не оснащен SSL-сертификатом (наиболее вероятный сценарий для локального веб-сервера разработки — просто проверьте,https://localhost:<port>работает или толькоhttp://localhost:<port>с главного компьютера). Это позволит вашему Android-приложению получить доступ к вашему локальному веб-серверу, как это делает Chrome.

Добавление определенных разрешений для доступа к открытому тексту (т.е.http://) из вашего приложения Android необходимо, начиная с Android 9 (API 28) и выше. Есть несколько способов настроить приложение Android для добавления этого разрешения, см. /questions/37330690/android-8-otkryityij-http-trafik-ne-razreshen/37330703#37330703

Заключение

Доступ к хосту из эмулятора Android может быть сложным, но с помощью тщательной пошаговой отладки в большинстве случаев можно решить проблему.

Последняя альтернатива, возможно, более быстрая, — получить платную подписку на такие сервисы, как ngrok, но бесплатная версия бесполезна, поскольку они обязательно открывают веб-приложение в веб-браузере, за пределами веб-просмотра вашего приложения для Android.

Если вы используете Android Emulator:

Вы можете подключиться к локальному хосту вашего ПК по этим IP-адресам: 10.0.2.2:{port of your localhost}=> если вы устанавливаете порт вашей машины в xamp, вы должны использовать этот порт. В моем случае 10.0.2.2:2080

Также вы можете использовать IP своего сетевого адаптера. В CMD напишите ipconfig и найдите свой IP-адрес адаптера:

Если эмулятор не может подключиться к этим IP-адресам, закройте эмулятор и откройте его с помощью cold boot из AVD Manager:

Если вы используете Genymotion:

Вы можете подключиться к localhost машины по этому IP: 10.0.3.2:{port number} Или IP-адрес вашего адаптера, как я объяснил выше: в моем случае: 192.168.1.3:2080

Мне нужно было выяснить системный IP-адрес хоста для эмулятора "Nox App Player". Вот как я понял это было 172.17.100.2,

  1. Установлен эмулятор терминала Android из магазина приложений
  2. вопрос ip link show Команда показать все сетевые интерфейсы. Особый интерес вызвал интерфейс eth1
  3. вопрос ifconfig eth1 команда, показывает чистую как 172.17.100.15/255.255.255.0
  4. Начните пинговать адреса, начиная с 172.17.100.1получил удар по `172.17.100.2'. Не уверен, что брандмауэр будет мешать, но в моем случае этого не произошло

Может быть, это может помочь кому-то другому разобраться с другими эмуляторами.

Разрешение установки PWA

Прежде всего, установите мост отладки Android:

      $ sudo apt install adb android-sdk-platform-tools-common

Запустите эмулятор Android как обычно, например:

      $ ~/Android/Sdk/emulator/emulator -avd Pixel_3a_API_30_x86

Только после этого настройте обратный прокси-сервер на мосту эмулятора Android, который будет пересылать HTTP-запросы на соответствующий порт (например, 8000) localhost сервер, работающий на вашем главном компьютере, и наоборот:

      $ adb reverse tcp:8000 tcp:8000

Прогрессивное веб-приложение (PWA), обслуживаемое localhost:8000 или же 127.0.0.1:8000 можно будет установить и подключиться к его service-worker.js. В то время как установка PWA не разрешена с IP-адреса. 10.0.2.2.

Предостережение: adb reverse tcp:8000 tcp:8000необходимо перевыпускать после каждого вызова эмулятора Android.

Следовательно, сценарий bash для запуска эмулятора Android с последующим обратным прокси-сервером будет выглядеть так:

      #!/usr/bin/env bash

$HOME/Android/Sdk/emulator/emulator -avd Pixel_3a_API_30_x86 > /dev/null 2>&1

adb reverse tcp:8000 tcp:8000

Принятый ответ правильный, но не сработал в моем случае. Пришлось создавать виртуальное устройство с выключенным корпоративным VPN-клиентом на хост-машине. Это вполне понятно, так как во многих корпоративных сетях используются адреса, начинающиеся с 10 (диапазон частной сети), что может мешать специальному адресу 10.0.2.2.

ДЛЯ ВСЕХ, ЧТО ПЫТАЕТСЯ ДОСТУПИТЬ К ЛОКАЛЬНОМУ Серверу IIS (ASP.NET)

Для меня принятого ответа было недостаточно. Мне пришлось добавить привязку для 127.0.0.1 в файл applicationhost.config, который находился в корне моего решения ASP.NET.

Если вы находитесь в Windows, вы можете зайти в систему simbol, написать ipconfig и проверить, какой ip назначен вашей машине.

В моем случае я использовал локальный сервер и работал над приложением Flutter, ориентированным на Android, iOS, Интернет. Это может вам помочь. - Здесь

2023 ответ:

У меня есть экспресс-приложение, прослушивающее локальный хост: 5001, и рабочий API по адресуmy-real-api.comпоэтому я использую:

      // BASE_URL.js
import Constants from "expo-constants";
const { manifest } = Constants;

const PORT=5001
export const BASE_URL =
  (typeof manifest?.packagerOpts === `object` &&
  !!manifest.debuggerHost &&
  manifest.packagerOpts.dev)
    // dev server
    ? `http://${manifest.debuggerHost.split(`:`).shift()}:${PORT}` + 
    // production server
    : "https://my-real-api.com";

а затем везде:

      import { BASE_URL } from "../BASE_URL"
import axios from "axios"
const my_data = await axios.get(BASE_URL+"/some/path")

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

Не знаю, может быть, эта тема уже решена, но когда я недавно попробовал сделать это на Windows-машине, я столкнулся с множеством трудностей. Поэтому мое решение было действительно простым. Я скачал этот софт http://www.lenzg.net/rinetd/rinetd.html следуя их инструкциям о том, как сделать переадресацию портов, а затем успешно подключил мое устройство Android к проекту asp.net localhost и остановился на моем критическом уровне.

мой файл rinetd.conf:

10.1.1.20 1234 127.0.0.1 1234
10.1.1.20 82 127.0.0.1 82

Где 10.1.1.20 - мой localhost ip, 82 и 1234 - мои порты. Также я создал специальный файл bath для вашей жизни yournameofbathfile.bat, поместите этот файл в папку rined. Мой банный файл:

rinetd.exe -c rinetd.conf

После запуска этого программного обеспечения, запустите сервер aps.net и попробуйте получить доступ с устройства Android или любого устройства в вашей локальной сети (например, Computer ABC запускает замазку), и вы увидите, что все работает. Не нужно идти к настройке роутера или делать какие-то другие сложные вещи. Я надеюсь, что это поможет вам. Наслаждаться.

Другой обходной путь - получить бесплатный домен от no-ip.org и указать его на свой локальный IP-адрес. Тогда вместо использования http://localhost/yourwebservice ты можешь попробовать http://yourdomain.no-ip.org/yourwebservice

10.0.2.2 сделан для localhost базовой машины.

номер порта такой же: 1521 менять не нужно

абс у меня отлично работает ..

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