🍬

【初心者向け】10.0.2.2という特別なアドレスについて

2025/02/15に公開

こんにちは、ワニかず@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の一部として組み込まれている機能

ということなのです。
つまり、

  1. Django: 「私はlocalhost:8000で待ってます」
  2. Androidエミュレータ: 「じゃあ、私は10.0.2.2:8000というトンネルを勝手に作って、そこからアクセスしますね」
  3. Django: 「えっ...まあ、仕方ない。じゃあそのアドレスからのリクエストもALLOWED_HOSTS(という許可リスト)に入れておきますよ...」

このような感じで、エミュレータが独自に作った経路に対して、
Django側が「受け入れる」という対応をしているわけです。

おしまいに

特別な〇〇と聞くと、
ヴェルタースオリジナルを思い出すのは、私だけ?
美味しいですよね、あの飴。
https://dic.pixiv.net/a/ヴェルタースオリジナル

ということで、アイキャッチの画像の意味を回収していきます。
それでは!

Discussion