WebViewでlocalhostを参照する実装をAndroid Emulatorで見る際、net::ERR_CONNECTION_REFUSED
というエラーが表示された。
接続先はhttp://localhost:3000/
を指定していたのだが、Android Emulatorは仮想環境上で実行されているため、ホストマシンで直接実行しているローカルサーバーには接続できない模様。
エミュレータの各インスタンスは、仮想ルーターおよびファイアウォール サービスの背後で実行されます。この仮想ルーターおよびファイアウォール サービスによって、各インスタンスは開発マシンのネットワーク インターフェースと設定、そしてインターネットから分離されます。エミュレートしたデバイスでは、開発マシンやネットワーク上のその他のエミュレータ インスタンスは認識されず、イーサネット経由でルーター / ファイアウォールに接続されていることだけが認識されます。
各インスタンスの仮想ルーターは、10.0.2/24 ネットワーク アドレス空間を管理します。ルーターによって管理されるすべてのアドレスは、10.0.2.xx の形式を持ちます(xx は数字)。この空間内のアドレスは、エミュレータ / ルーターによって次のように事前に割り当てられます。
Android Emulator のネットワークを設定する | Android デベロッパー | Android Developers
Android Emulatorからホストマシンのローカルループバックアドレス(127.0.0.1)を参照するためには、ネットワークアドレス10.0.2.2
を使用する必要がある。
ネットワーク アドレス | 説明 |
---|---|
10.0.2.1 | ルーター / ゲートウェイ アドレス |
10.0.2.2 | ホスト ループバック インターフェースへの特殊エイリアス(開発マシンの 127.0.0.1 など) |
10.0.2.3 | 1 番目の DNS サーバー |
10.0.2.4 / 10.0.2.5 / 10.0.2.6 | オプションの 2 番目、3 番目、4 番目の DNS サーバー(存在する場合) |
10.0.2.15 | エミュレートしたデバイスのネットワーク / イーサネット インターフェース |
127.0.0.1 | エミュレートしたデバイスのループバック インターフェース |
WebViewの接続先をhttp://10.0.2.2:3000/
に指定することで、localhostへアクセスすることができた。
これまでAndroid Emulator上でlocalhostを参照する機会がなかったため、大変勉強になった。