2010-12-11 120 views
2

我正在寫一個支持多人遊戲的Android視頻遊戲。有一個專用的服務器運行時,通過打開一個套接字點擊多人按鈕時,androids可以連接到這個服務器(這可以很好地工作)。服務器基本上只是用作匹配系統。Android的IP地址與java

當客戶端託管遊戲時,服務器將該客戶端添加到主機列表中。其他客戶端可能會選擇查看此列表,然後連接到該主機。這是問題所在。服務器應該跟蹤主機的IP /端口,然後其他客戶端應該使用此信息與主機打開一個套接字,然後遊戲開始。我試圖讓主機將其自己的IP地址發送到服務器,以供其他客戶端稍後使用。

到目前爲止,我嘗試了很多方法。一個是:

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地址,但是當我運行它作爲一個Android應用程序,它不起作用。如果最後的條件不滿足,並且myIP最終爲空。請注意,我已包含權限:android.permission.INTERNET,android.permission.ACCESS_WIFI_STATE,android.permission.ACCESS_COARSE_LOCATION,android.permission.ACCESS_NETWORK_STATE。

任何人都可以幫助我嗎?

+0

你是否從「adb shell」中的「ifconfig」獲得了相同的地址?如果是這樣,你的手機可能在NAT後面,這意味着你不能直接主持遊戲。 – 2010-12-12 02:34:16

回答

1

您是否必須依賴主機來找出自己的IP地址並將其提供給服務器?如果主機打開一個連接並向服務器發送一條消息,宣佈它正在託管一個遊戲,那麼服務器是否可以使用連接和消息來自的IP地址?這可以完全避免這個問題。

0

試試這個

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爲WiFi連接,你可以獲取IP的32位整數:

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

然後,爲了構建IP中點十進制表示法;比特移位和屏蔽的結果:

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

+1老學校按位 – 2012-11-20 20:31:57

+0

對於我們所有人來說,這裏有一個更詳細的代碼工作方式。 :D http://stackoverflow.com/questions/27170602/cannot-understand-how-to-convert-integer-to-ip-in-android-and-java/27170860#27170860 – msmechanized 2014-11-27 13:37:24