🍬
【初心者向け】10.0.2.2という特別なアドレスについて
こんにちは、ワニかず@40歳 出戻りエンジニアです。
10.0.2.2
は、Androidエミュレータからホストマシン(開発に使用しているPC)のlocalhostにアクセスするための特別なIPアドレスとなっています。
この仕組みがイマイチ理解できなかったので整理してみました。
通常のWebサイトの場合
ブラウザ → http://www.example.com → Djangoサーバー
というアクセスをする場合
- ブラウザは
www.example.com
に対してリクエストを送ります - Djangoは「私は
www.example.com
というアドレスで提供されているサーバーです」という立場
です。
10.0.2.2という特別なアドレスの場合
- 開発に使用しているPCで
- Flutter appから
- Djangoで作ったバックエンドにデータを取得しにいく
という例で考えると、Androidエミュレータのネットワークシステムの中では、
[Flutter app] → [10.0.2.2:8000] → [Djangoサーバー]
というアクセスをする場合、
- Flutter appは
10.0.2.2:8000
に対してリクエストを送ります - Djangoは「私は
10.0.2.2:8000
というアドレスでサーバーを提供していません」という立場
だというのです。
実は、Androidエミュレータのネットワークシステムの中では
エミュレータ内部 トンネル ホストPC
[Flutter app] → [10.0.2.2:8000] =========> [localhost:8000] → [Djangoサーバー]
というような「変換」が行われています。
これは、Androidエミュレータ中の特別なネットワークマッピングで、
- Androidエミュレータは起動時に仮想的なネットワーク環境を作る
- この環境の中で、
10.0.2.2
は「ホストマシンのlocalhost」へのマッピングとして設定 - これはAndroid SDKの一部として組み込まれている機能
ということなのです。
つまり、
- Django: 「私は
localhost:8000
で待ってます」 - Androidエミュレータ: 「じゃあ、私は
10.0.2.2:8000
というトンネルを勝手に作って、そこからアクセスしますね」 - Django: 「えっ...まあ、仕方ない。じゃあそのアドレスからのリクエストも
ALLOWED_HOSTS
(という許可リスト)に入れておきますよ...」
このような感じで、エミュレータが独自に作った経路に対して、
Django側が「受け入れる」という対応をしているわけです。
おしまいに
特別な〇〇と聞くと、
ヴェルタースオリジナルを思い出すのは、私だけ?
美味しいですよね、あの飴。
ということで、アイキャッチの画像の意味を回収していきます。
それでは!
Discussion