Rog*_*ger 2 java networking android
我正在编写支持多人游戏的Android视频游戏.有一个专用的服务器运行,当通过打开套接字点击多人游戏按钮时,机器人连接到这个服务器(这很好).服务器基本上只是作为配对系统.
当客户端托管游戏时,服务器会将该客户端添加到主机列表中.其他客户端可以选择查看此列表,然后连接到该主机.这就是问题所在.服务器应该跟踪主机的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) {
}
Run Code Online (Sandbox Code Playgroud)
这将返回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();
}
Run Code Online (Sandbox Code Playgroud)
当我作为一个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();
Run Code Online (Sandbox Code Playgroud)
然后,以点十进制表示法构造IP; 位移并掩盖结果:
String ipString = String.format(
"%d.%d.%d.%d",
(ip & 0xff),
(ip >> 8 & 0xff),
(ip >> 16 & 0xff),
(ip >> 24 & 0xff));
Run Code Online (Sandbox Code Playgroud)
清单中将需要android.permission.ACCESS_WIFI_STATE权限.
| 归档时间: |
|
| 查看次数: |
7289 次 |
| 最近记录: |