2010-12-11 7 views
2

私はマルチプレーヤーをサポートする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が含まれています。

誰も私を助けることができますか?

+0

"adbシェル"の "ifconfig"から同じアドレスを取得していますか?その場合、携帯電話がNATの背後にある可能性があります。つまり、ゲームを直接ホストすることはできません。 –

答えて

1

ホストに依存して独自のIPアドレスを把握し、これをサーバーに提供する必要がありますか。ホストが接続を開いてゲームをホストしていることを知らせるメッセージをサーバーに送信すると、サーバーは接続とメッセージの発信元IPアドレスを使用できますか?これにより、問題は完全に回避されます。

0

あなただけのWiFi接続のためのIPが必要な場合は、32ビット整数としてIPを取得することができ、この

WifiManager wim= (WifiManager) getSystemService(WIFI_SERVICE) ; 
    List<WifiConfiguration> l= wim.getConfiguredNetworks(); 
    WifiConfiguration wc=l.get(0); 
textview.append( "\n"+ Formatter.formatIpAddress(wim.getConnectionInfo().getIpAddress())); 
9

を試してみてください:でIPを構築するために、次に

WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
int ip = wifiInfo.getIpAddress(); 

ドット10進表記法。ビットシフトし、その結果マスク:

String ipString = String.format(
"%d.%d.%d.%d", 
(ip & 0xff), 
(ip >> 8 & 0xff), 
(ip >> 16 & 0xff), 
(ip >> 24 & 0xff)); 

android.permission.ACCESS_WIFI_STATE権限がマニフェストに必要とされるであろうが。

+0

古き良き時代のビットのためのビット –

+0

私たち全員のために、このコードがどのように動作するかをより詳細に説明します。 :D http://stackoverflow.com/questions/27170602/cannot-understand-how-to-convert-integer-to-ip-in-android-and-java/27170860#27170860 – msmechanized

関連する問題