私はマルチプレーヤーをサポートするAndroidのビデオゲームを書いています。マルチプレイヤーボタンをクリックしてソケットを開くと、アンドロイドが接続する専用サーバーが動作します(これはうまくいきます)。サーバーは基本的にマッチメイキングシステムとして機能します。AndroidのIPアドレスとjava
クライアントがゲームをホストすると、サーバーはそのクライアントをホストのリストに追加します。他のクライアントはこのリストを表示し、その後そのホストに接続することを選択できます。これが問題の原因です。サーバーはホストのIP /ポートを追跡していると考えられ、他のクライアントはこの情報を使ってホストとソケットを開いてゲームを開始することになっています。私は後で使用するために、他のクライアントのためにサーバーに自分のIPアドレスを送信するようにホストを取得しようとしています。
これまで多くの方法を試しました。 1つは:
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (SocketException ex) {
}
これは10.0.2.15を返します。これは他のクライアントにとって明らかに役に立たないものです。
私が試した他の方法はこれです:
String hostName = InetAddress.getLocalHost().getHostName();
InetAddress addrs[] = InetAddress.getAllByName(hostName);
for (InetAddress addr: addrs) {
System.out.println ("addr.getHostAddress() = " + addr.getHostAddress());
System.out.println ("addr.getHostName() = " + addr.getHostName());
System.out.println ("addr.isAnyLocalAddress() = " + addr.isAnyLocalAddress());
System.out.println ("addr.isLinkLocalAddress() = " + addr.isLinkLocalAddress());
System.out.println ("addr.isLoopbackAddress() = " + addr.isLoopbackAddress());
System.out.println ("addr.isMulticastAddress() = " + addr.isMulticastAddress());
System.out.println ("addr.isSiteLocalAddress() = " + addr.isSiteLocalAddress());
System.out.println ("");
if (!addr.isLoopbackAddress()){// && addr.isSiteLocalAddress()) {
myIP = addr.getHostAddress();
}
これは私がJavaアプリケーションとして、それを実行したときに私が探しているIPアドレスを返しますが、私はアンドロイドのアプリケーションとして、それを実行すると、それは動作しません。最後のif条件が何らかの形で満たされず、myIPがnullになってしまいます。許可には、android.permission.INTERNET、android.permission.ACCESS_WIFI_STATE、android.permission.ACCESS_COARSE_LOCATION、android.permission.ACCESS_NETWORK_STATEが含まれています。
誰も私を助けることができますか?
"adbシェル"の "ifconfig"から同じアドレスを取得していますか?その場合、携帯電話がNATの背後にある可能性があります。つまり、ゲームを直接ホストすることはできません。 –