用java的Android IP地址
我正在编写支持多人游戏的Androidvideo游戏。 有一个专用的服务器运行,当通过打开套接字点击多人游戏按钮时,机器人连接到该服务器(这很好)。 服务器基本上只是作为配对系统。
当客户端托管游戏时,服务器会将该客户端添加到主机列表中。 其他客户端可以选择查看此列表,然后连接到该主机。 这就是问题所在。 服务器应该跟踪主机的ip /端口,然后其他客户端应该使用此信息与主机打开套接字然后游戏启动。 我正在尝试让主机将自己的IP地址发送到服务器,供其他客户端稍后使用。
到目前为止,我尝试了很多方法。 一个是:
try { for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration 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应用程序运行它时,它不起作用。 最后一个if条件以某种方式不满足,myIP最终为null。 请注意,我已经包含权限:android.permission.INTERNET,android.permission.ACCESS_WIFI_STATE,android.permission.ACCESS_COARSE_LOCATION,android.permission.ACCESS_NETWORK_STATE。
有谁能够帮我?
如果您只需要用于Wifi连接的IP,则可以将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权限。
您是否必须依靠主机找出自己的IP地址并将其提供给服务器? 如果主机打开连接并向服务器发送消息,宣布它正在托管游戏,那么服务器是否可以使用连接和消息来自的IP地址? 这样可以完全避免这个问题。
试试这个
WifiManager wim= (WifiManager) getSystemService(WIFI_SERVICE) ; List l= wim.getConfiguredNetworks(); WifiConfiguration wc=l.get(0); textview.append( "\n"+ Formatter.formatIpAddress(wim.getConnectionInfo().getIpAddress()));
- Android – 来自Map 的HttpURLConnection参数通过POST方法
- 在Realm上迁移0.81.1
- “清单合并失败意味着什么:uses-sdk:minSdkVersion 9不能小于版本14”
- 无法打开调试端口:java.net.socketexception“连接被拒绝” – Android Studio
- 如何在android中将单个字符串转换为JsonArray?
- tableview中的android:xml解析输出
- 如何保存/加载BigInteger数组
- 如何使用libgdx获取手机语言?
- 带有自定义标记器的Android MultiAutoCompleteTextView,如whatsapp GroupChat