Android 에뮬레이터에서 localhost : port에 액세스


224

에서 실행되는 로컬 컴퓨터에서 웹 서비스를 실행하고 localhost:54722있습니다.

Android 에뮬레이터에서 실행되는 앱에서 서비스를 호출하고 싶습니다.

10.0.2.2앱에서 사용 하면 localhost에 액세스 한다는 것을 읽었 지만 포트 번호로는 작동하지 않는 것 같습니다. 라고 말합니다 HttpResponseException: Bad Request.



1
모든 포트가 전달되는 것은 아닙니다. 5555는 전달되지 않았지만 8080 및 8081은 정상적으로 작동했습니다.
Florian Loch

당신은 편집 할 필요가 당신의 VS-IIS를 구성 파일 : stackoverflow.com/a/50991257/7149454
닉 Kovalsky

답변:


408

IP 주소 " 10.0.2.2"를 사용하여 호스트 시스템에 액세스 할 수 있습니다 .

이것은 안드로이드 팀에 의해 이런 식으로 설계되었습니다. 따라서 웹 서버는 localhost에서 완벽하게 실행할 수 있으며 Android 앱에서 " http://10.0.2.2:<hostport>" 를 통해 액세스 할 수 있습니다 .

에뮬레이터가 프록시 서버를 통해 인터넷에 액세스해야하는 경우 에뮬레이터의 확장 제어 화면에서 사용자 정의 HTTP 프록시를 구성 할 수 있습니다. 에뮬레이터가 열린 상태에서 추가 도트 를 클릭 한 다음 설정프록시 를 클릭 합니다 . 여기에서 고유 한 HTTP 프록시 설정을 정의 할 수 있습니다. HTTP 구성 스크린 샷


9
왜 그래야합니까? 잘못된 요청 오류는 로컬 호스트 서버에 연결할 수 있지만 요청이 정확하지 않음을 의미합니다.
Dediqated

확실하지 않습니다, 나는 당신을 정확히 무엇을 말하고 있는지, 제공된 솔루션과 관련이 있습니까?
Akhil Jain

지금 당장 나를 위해 일하지는 않지만 여기 Android 문서에 대한 링크가 있으며 이것이 영혼이하는 일이라는 것이 분명합니다 (10.0.2.2). developer.android.com/tools/devices/emulator.html
Stuart Hallows 2014 년

23
분명히 이것은 아무것도 명확히하지 못합니다. 로빈은 이미 질문에 10.0.2.2 ip를 사용하고 있으며 작동하지 않습니다. 귀하의 답변은 정확하지만 해결책을 제공하지는 않습니다.
iversoncru

나도 400을 얻습니다 : 동일한 솔루션으로 잘못된 요청 오류가 발생했습니다.
Keval Patel

55

기본 AVD에 10.0.2.2를 사용하고 Genymotion에 10.0.3.2를 사용하십시오.


4
Genymotion에 10.0.3.2가 필요한 이유는 무엇입니까?
Jacob

1
@Jacob Genymotion은 다른 에뮬레이터이기 때문에 Google의 에뮬레이터와 다른 IP를 사용하기로 선택했습니다 (무엇이 경계가 없습니까? 진지하게, 그들은 그들의 끔찍한 기본 에뮬레이터에 대해 뭔가를 할 예정입니까?)
computrius

API 28+에서는 네트워크 구성에서 비 http (일반 텍스트) 트래픽도 명시 적으로 허용해야합니다. 아래의 답변을 참조하십시오 stackoverflow.com/a/56769746/2290369
İsmail Yavuz

19

IIS Express에서 웹 응용 프로그램을 실행하는 Visual Studio에서 동일한 문제에 직면했습니다. 수정하려면 프로젝트 속성으로 이동 한 다음 디버그 탭을 클릭하고 http : // localhost : [YOUR PORT]를 http://127.0.0.1:[YOUR PORT]로 변경하고 안드로이드 URL을 http : / 로 설정해야합니다 . /10.0.2.2:[YOUR PORT]. 그것은 나를 위해 일했다.


1
이것은 10.0.0.2 URL과 함께 나를 위해 해결했습니다. 이 설정은 hosts.json 접근 방식을 재정의하는 것처럼 보였습니다.
user761574

1
macOS에서 로컬로 django 서버를 실행하고 있으며 일반적으로 http://localhost:5000/Postman 및 iOS 시뮬레이터 를 통해 액세스합니다 . 이 솔루션은 Android 시뮬레이터에서 작동하며 서버 또는 시뮬레이터의 설정을 수정할 필요가 없습니다. 추가 작업없이 다른 컴퓨터로 빠르고 멋지 며 휴대 가능합니다.
존 팡

VS를 사용하는 xamarin 및 ASP.NET 웹 API가있는 Android 앱 일했다! 감사!!
sohaib는

15

IIS Express를 사용하는 경우`localhost '대신 모든 호스트 이름에 바인딩해야 할 수도 있습니다. 이 정답을 확인하십시오.

https://stackoverflow.com/a/15809698/383761

모든 IP 주소 및 호스트 이름에 바인딩하도록 IIS Express 자체에 지시하십시오. .config 파일 (일반적으로 % userprofile % \ My Documents \ IISExpress \ config \ applicationhost.config 또는 Visual Studio 2015의 경우 $ (solutionDir) .vs \ config \ applicationhost.config)에서 사이트의 바인딩 요소를 찾아 추가하십시오.

<binding protocol="http" bindingInformation="*:8080:*" />

기존 사이트를 수정하는 대신 두 번째 바인딩으로 추가해야합니다. 그렇지 않으면 VS가 추가 된 새 사이트 만 다시 추가합니다. (1) 또한 관리자로 VS를 실행해야 할 수도 있습니다.


아니요, 항상 빈 호스트 이름 인 blog.lextudio.com/
Lex Li

<binding protocol = "http"bindingInformation = "* : 15000 : 127.0.0.1"/> 이것은 IIS Express가 15000이 내 포트 인 곳에서 좋아하는 방식이었고 안드로이드 에뮬레이터에서 10.0.2.2:15000을 가리키고
있었습니다

11

Visual Studio Professional 2015에서 "Conveyor by Keyoti"를 설치하여 문제를 해결했습니다. 컨베이어는 외부 요청을 가능하게하는 포트 (45455)로 REMOTE 주소 (IP)를 생성합니다. 예:

여기에 이미지 설명을 입력하십시오

컨베이어 (없이 안드로이드 에뮬레이터 네트워크에 또는에서 외부 태블릿 및 휴대 전화에서에서 당신 테스트 웹 응용 프로그램을 할 수 있습니다 http://10.0.2.2:<hostport>)

단계는 다음 링크에 있습니다.

https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti


Visual Studio에서 웹 서버를 실행하지 않으면 어떻게됩니까? 이모, 이것은 질문에 대한 답변이 아닙니다.
jAC

시도하지만 며칠 후에 주어진 URL이 작동하지 않고 해결책을 찾지 못했습니다.
Md Imran Choudhury

오랜 노력 끝에 트릭을 한 유일한 방법은이 확장을 설치하고 원격 URL 기능을 활성화하는 것입니다. API에 도달하는 데 약간의 시간이 걸리지 만 작동합니다.
fabian278

9

로컬 호스트에서 웹 서버가 실행 중입니다.

에뮬레이터를 열고 로컬 호스트에 연결하려면을 사용하고 192.168.x.x있습니다. 즉, 로컬 LAN IP 주소를 사용해야합니다. 그건 그렇고, 당신 HttpResponseException (Bad Request)이 호스트에 접근 할 수 없다는 것을 의미하지는 않습니다.

다른 오류로 인해이 예외가 발생합니다.


9

10.0.2.2Android의 보안 도메인이 아니기 때문에 기본적으로 비 TLS 연결이 금지 된 API 28+의 네트워크 구성에서 보안되지 않은 도메인을 허용해야합니다.

다음 구성을 사용할 수 있습니다.

다음과 같이 main / res / xml / network_security_config.xml에 새 파일을 작성하십시오.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">10.0.2.2</domain>
    </domain-config>
</network-security-config>

그리고 AndroidManifest.xml에서 지적하십시오.

<application
......
......
android:networkSecurityConfig="@xml/network_security_config">

8

문제는 안드로이드 에뮬레이터 매핑이다 10.0.2.2127.0.0.1, 하지localhost. 따라서 웹 서버를 서버가 127.0.0.1:54722아닌 서버로 구성하십시오 localhost:54722. 그렇게해야합니다.


7

로컬 호스트를 실행 한 후 http://localhost:[port number]/포트 번호를 찾았습니다.

그런 다음 Command에서 IP 주소를 얻고 windows 명령을 열고 입력하십시오. ipconfig 여기에 이미지 설명을 입력하십시오

필자의 경우 IP는 192.168.10.33내 URL이 http://192.168.10.33 : [포트 번호] /입니다. Android에서 스튜디오는이 URL을 URL로 사용합니다. 그런 다음 에뮬레이터의 수동 프록시에서 URL과 포트 번호를 설정하십시오.

여기에 이미지 설명을 입력하십시오


3

당신은 URL을 설정해야합니다 10.0.2.2:portNr

portNr = 현재 서비스가 실행되고있는 ASP.NET 개발 서버의 지정된 포트 localhost:3229/Service.svc

그래서 내 URL은 10.0.2.2:3229

이 방법으로 내 문제를 해결했습니다.

나는 그것이 도움이되기를 바랍니다 ...


3

"BadRequest"는 일반적으로 서버 자체에서 전송 된 오류입니다. rfc 2616 참조

10.4.1 400 잘못된 요청

잘못된 구문으로 인해 서버에서 요청을 이해할 수 없습니다. 클라이언트는 수정없이 요청을 반복해서는 안됩니다.

따라서 서버에 연결되어 있지만 요청이 Expecet 양식에 맞지 않습니다. 연결을 만드는 방법, 포함 된 헤더 (있는 경우)를 모르지만 확인해야합니다.

도움이 더 필요한 경우 코드의 내용과 서버에 연결하는 데 사용되는 내용을 설명하면 큰 그림을 볼 수 있습니다.

여기에 같은 문제와 질문 - 대답했다 그 헤더의 내용 유형 그런게 세트입니다.


당신은 올바른 지적을 얻었지만 나중에 잘못된 방향으로 갔다. 다음 단계는 에뮬레이터의 요청이 400으로 응답되는 이유를 이해하기 위해 서버가 어떤 종류의 요청에 관심이 있는지 파악하기 위해 서버를 분석해야합니다. IIS Express에 대한 사례 연구는 여기 ( blog.lextudio.com/)
Lex Li

1

Android 에뮬레이터에서 IISExpress 웹 API에 액세스하는 방법을 보여 드리고자합니다. Visual Studio 2015를 사용하고 있습니다. Android Studio에서 Android Emulator를 호출합니다.

내가해야 할 일은 applicationhost.config 파일 의 바인딩 구성에 다음 줄을 추가하는 것입니다.

<binding protocol="http" bindingInformation="*:<your-port>:" />

그런 다음 IP4 주소를 확인하고 사용하여 Android 에뮬레이터에서 API에 액세스합니다.

요구 사항 : Visual Studio를 관리자 권한으로 실행해야합니다. 이 게시물 를 수행하는 완벽한 방법을 제공합니다.

자세한 내용 은 github에 대한 내 게시물 을 방문하십시오

도움이 되었기를 바랍니다.


2
또는 Extensions 창에서 Conveyor라는 무료 VS Extension을 설치하십시오. 그러면 구성을 변경하지 않고도 IIS Express가 외부 요청으로 열립니다.
짐 W는 모니카 복원

VS를 관리자 권한 으로 실행하는 것 외에 blog.lextudio.com/… 과 같은 다른 옵션이 있습니다 . 그래서 나는 그것을 필수 라고 부르지 않을 것이다 .
Lex Li

1

Laravel Homestead 사용자 : Laravel을 Homestead와 함께 사용하는 사람이라면 에뮬레이터에서 192.168.10.10을 사용하여 앱 백엔드에 액세스 할 수 있습니다

그래도 작동이 안되는? 또 다른 좋은 해결책은 ngrok https://ngrok.com/ 을 사용하는 것입니다


1

Windows 10을 개발 플랫폼으로 사용하고 있으며 에뮬레이터의 10.0.2.2:port에 액세스하는 것이 예상대로 작동하지 않으며이 질문의 다른 솔루션에 대해서도 동일한 결과가 발생합니다.

몇 시간 동안 파고 후 에뮬레이터 시작 명령 에 -writable-system 인수를 추가하면 문제 가 해결됩니다.

아래와 같이 명령 행을 통해 에뮬레이터를 시작해야합니다.

 emulator.exe -avd <emulator_name> -writable-system

그런 다음 에뮬레이터에서 LAN IP 주소 및 바인딩 포트를 사용하여 호스트 시스템에서 실행되는 API 서비스에 액세스 할 수 있습니다.

http://192.168.1.2:<port>

이것이 도움이되기를 바랍니다.

: 약 명령 줄에서 에뮬레이터 시작 https://developer.android.com/studio/run/emulator-commandline을 .


1

Android 에뮬레이터에서 localhost에 액세스하려면

  • AndroidManifest.xml에서 인터넷 권한 추가
    <uses-permission android:name="android.permission.INTERNET" />

  • android:usesCleartextTraffic="true"자세한 내용은 여기에 추가 하십시오 .

  • 아래 언급 된 명령을 실행하여 시스템 IP 주소를 찾으십시오.

ifconfig | grep "inet " | grep -v 127.0.0.1

이 단계에서 얻은 IP 주소를 복사하십시오 (A).

  • 시스템 에서 localhost또는 127.0.0.1시스템에서 액세스 할 수있는 백엔드 애플리케이션을 실행하십시오 .

  • 이제 android studio에서 코드에서 사용하는 경우 URL을 바꾸거나 단계 (A)에서 얻은 IP 주소를 사용하여 웹 브라우저에서 열 수 있습니다. http://192.168.0.102:8080/

IP 주소 뒤에 PORT를 추가하는 것을 잊지 마십시오. 제 경우에는 앱이 8080 포트에서 실행 중이므로 포트 8080으로 (A)에서 얻은 IP를 추가했습니다.


0

localhost는 시작할 때 내 에뮬레이터에서 제대로 작동하는 것처럼 보였고 연결 거부 예외가 발생하기 시작했습니다. 에뮬레이터 브라우저에서 127.0.2.2를 사용했으며 에뮬레이터의 내 Android 앱에서이를 사용하면 다시 연결 거부 문제를 표시하기 시작했습니다. .

그런 다음 ifconfig를하고 ip 192.168.2.2를 사용했으며 완벽하게 작동했습니다.


0

잘못된 요청은 일반적으로 보내는 데이터의 형식이 잘못되었음을 의미합니다. 데이터 매핑이 일치하지 않을 수 있습니다. 요청이 잘못되면 서버에 연결할 수 있지만 요청이 제대로 전송되지 않는 것입니다.


0

아무도 여전히 이것을 찾고 있다면 이것이 나를 위해 일한 방법입니다.

연결된 장치 / 에뮬레이터와 관련하여 컴퓨터의 IP를 찾아야합니다. 에뮬레이터의 경우 다음 단계를 수행하십시오.

  1. VM 가상 상자로 이동-> 목록에서 연결된 장치를 선택하십시오.
  2. 설정-> 네트워크-> 장치가 연결된 네트워크 찾기를 선택하십시오. 저에게는 'VirtualBox 호스트 전용 이더넷 어댑터 # 2'였습니다.
  3. virtualbox에서 파일-> 환경 설정-> 네트워크-> 호스트 전용 네트워크로 이동하여 위 단계에서 지정된 네트워크의 IPv4를 찾으십시오. (호버링하면 정보를 얻을 수 있습니다)

에뮬레이터에서 로컬 호스트에 액세스하려면이 IP를 제공하십시오. 포트는 서비스를 실행 / 게시하는 동안 제공 한 것과 동일합니다.

참고 # 1 : 방화벽 및 인바운드 규칙을 관리했는지 확인하십시오.

참고 # 2 : 컴퓨터를 다시 시작한 후이 IP를 확인하십시오. 어떤 이유로 든 "다음 IP 사용"을 제공 한 경우에도 호스트 전용 IP가 변경되었습니다.


0

서비스 계층에서 Visual Studio IIS Express를 사용할 때 발생하는 정확한 문제를 해결했습니다. 10.0.2.2를 가리키면 포트가 작동하지 않습니다. 다른 게시물에서 언급했듯이 IIS Express를 엉망으로 만드는 대신 IIS Express 앞에 프록시를 배치했습니다. 예를 들어, 아파치 또는 nginx. nginx.conf는 다음과 같습니다

 # Mobile API
 server { 
    listen       8090;
    server_name  default_server;

    location / {
        proxy_pass http://localhost:54722;
    }
  }

그런 다음 안드로이드는 내 IP 주소를 192.168.xx : 8090으로 가리켜 야합니다.


0

node express 또는 angular-cli와 같은 타사 패키지를 사용하는 경우 컴퓨터의 IP를 찾아서 localhost 대신 서버 시작 구성 내에서 해당 IP에 호스트를 연결해야합니다. 그런 다음 IP를 사용하여 에뮬레이터에서 시작하십시오. 예를 들어, ng serve -H 10.149.212.104angular-cli를 사용 하려면 다음 을 사용해야했습니다. 그런 다음 에뮬레이터에서 사용했습니다.http://10.149.212.104:4200


0

1) cmd에서 ipconfig 명령을 실행하십시오.

2) 당신은 이와 같은 결과를 얻을 것입니다 여기에 이미지 설명을 입력하십시오

3) 그런 다음 VMWare 네트워크 어댑터 1의 IPv4 주소와 포트 번호를 차례로 사용하십시오.

내 경우 8080이므로 localhost를 사용하는 대신 8080

192.168.56.1:8080을 사용하고 있습니다

여기에 이미지 설명을 입력하십시오

끝난.....


0

localhost기본 액세스 문제가있는 사람이 에뮬레이터에서 사용할 수없는 이유를 설명하십시오 . 정교한 경우 다른 답변을 읽으십시오.

문제 : 에뮬레이터에는 자체 로컬 네트워크가 있으며 호스트 localhost자체가 아니라 에뮬레이터에 매핑됩니다 !

해결책:

  1. 0.0.0.0에뮬레이터의 네트워크에서 사용할 수 있도록 서버 바인딩
  2. 노트북의 외부 IP 주소 얻기 : ifconfigMac 용 명령
  3. 안드로이드 (또는 떨림 응용 프로그램)에서 같은 외부 인터페이스의 IP 주소를 사용 192.168.1.10하는 대신localhost

0

Android 에뮬레이터에서 IIS .NET 웹 서비스에 연결하려고 할 때도 같은 문제가 발생했습니다.

  1. 설치 npm install -g iisexpress-proxy
  2. iisexpress-proxy 53990 to 9000 IIS Express 포트를 9000으로 프록시하고 에뮬레이터에서 포트 9000에 액세스 "http://10.0.2.2:9000"

그 이유는 기본적으로 IIS Express는 네트워크 https://forums.asp.net/t/2125232.aspx?Bad+Request+Invalid+Hostname+when+accessing+localhost+Web+API 에서의 연결을 허용하지 않는 것 같습니다. + 또는 + Web + App + from + across + LAN

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.