環境
- Windows10 (Tomcat起動元)
- Tomcat8, [Intellij経由で起動]
- Android Device
Windows10上でIntellijにより起動したTomcat8上で動作しているWebアプリケーションの動作確認をしたい,というか,Android アプリでそのWebアプリとHttp通信をしたかった.
まだアプリも全然出来上がっておらず,本番サーバーに置くのも面倒くさいので,ローカル環境で試したいと思ったのがきっかけです.
原因としては複数種類考えられます.解決に非常に時間がかかってしまったので,同じ罠にはまらないようにまとめておきます.今後,Windows10上のサーバーをローカルサーバ,Android Deviceのことをクライアントと呼びます.
*なお,ファイアウォールの設定はセキュリティレベルの低下を招くので,自己責任で行ってください.
localhostで接続しようとしている
このミスをする人はあまりいないかもしれませんが,localhost = 127.0.0.1ですので,クライアントから接続するためには,以下のようにローカルサーバーのIPアドレスで接続する必要があります.例えば,ローカルサーバーのIPアドレスが192.168.0.4で,Tomcatが8080で起動しているのであれば以下のように指定します.
http://192.168.0.4:8080/webapplication/...
ipアドレスはWindowsであればipconfig, Linux等ならifconfigで調べましょう.
同じネットワーク帯にいない
Android Deviceのipアドレスを調べましょう.同一ネットワークにいることを確認します.Android Deviceのipアドレスはadb shellでDeviceと接続してから,ifconfigコマンドを叩くのが楽だと思います.Android/SDKの中にすでに用意されていますので,そのディレクトリまで移動してdeviceが接続されている状態でadb shellを使いましょう

また,同一ネットワークにいることを確認できたら,Windows10からpingを飛ばして,念のため接続できることを確認しておきましょう.なお,Android Deviceからpingを飛ばしても,Windowsのファイアウォールではじかれてしまうのでpingは帰ってきません.飛ばすのであればWindowsから飛ばしてください
ルータのネットワーク分離機能が有効になっている
Wi-fiで接続されている端末同士が通信できないようにするネットワーク分離機能が働いている可能性があります.ネットワーク分離機能,セパレータ,プライバシーセパレータ等の名称で呼ばれいますので,ご自身のルータでそれっぽい機能をDisableしてください.
ちなみに,atermでは以下の箇所で設定できます.192.168.0.1でアクセスしてください.

ルータでパケットフィルタリングが設定されている
同じくルータの設定で,パケットフィルタリングの設定があると思いますので,そちらでTomcatが起動しているポート(開発環境であれば普通は8080にしていると思います)がフィルタリング対象になっていないことを確認してください.フィルタリングされている場合は,当該Portのフィルタリングを外してください.
Windowsのファイアウォールが有効になっている
Windowsのファイアウォールは全てのTCP/UDPをブロックし,許可するものだけ通過させるという仕組みで動いています.そのため,TCPポートを正しく許可する必要があります.以下の順序でファイアウォールにtcp 8080ポートの許可設定を追加しましょう.
設定画面を開いて,”Windowsファイアウォール”をクリック.

さらに詳細設定をクリックします

受信の規則を選択します

新しい規則をクリックします.

ポートにチェックを入れます

特定のローカルポートに8080を設定します.全てに設定するのはセキュリティ上非常によくないので,開発環境で一瞬だけ試したいという場合以外はやめてください.基本は特定のローカルポートを設定しましょう.

接続を許可します

接続するデバイスとローカルサーバを含むネットワーク帯を設定しましょう.

適当に名前をつける

これで完了です.ここまでで大概の人は接続できる状態になるのではないでしょうか?
javaのtcp接続を許可する
WindowsのファイアウォールでJavaのtcp接続がブロックされている可能性があります.これはローカルサーバ(Tomcat) をIDE経由で動作させている人が対象となると思います.
まず,起動したTomcatがどのプロセスで動いているか確認しましょう.cmd内で以下のコマンドを実行してください.
netstat -nao | find "8080"

すると出力結果として,オープンしているポートとプロセスIDが分かります.これがTomcatのプロセスIDということになりますが,このプロセスIDが何で動いているかを確認します.

java.exeで動いていますね.このアプリケーションに対するWindowsファイアウォールをDisableする必要があります.

なお,この操作はファイアウォールに穴をあけることになりますので,自己責任で行ってください.開発が終わったら再度有効化することを推奨します.
まとめ
今までファイアウォールに変更を加える機会などなかったので,解決に苦労した・・.誰かの役に立てば幸いです.