我正在寫一個支持多人遊戲的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。
任何人都可以幫助我嗎?
你是否從「adb shell」中的「ifconfig」獲得了相同的地址?如果是這樣,你的手機可能在NAT後面,這意味着你不能直接主持遊戲。 – 2010-12-12 02:34:16