Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓广播地址_Java_Android_Udp_Broadcast_Android Networking - Fatal编程技术网

Java 安卓广播地址

Java 安卓广播地址,java,android,udp,broadcast,android-networking,Java,Android,Udp,Broadcast,Android Networking,我正在为我的Android手机制作一个客户端服务器应用程序 我在Python中创建了一个UDP服务器,它可以坐在那里监听连接 我可以像192.169.0.100那样直接将服务器IP地址放入,它可以很好地发送数据。我还可以输入192.168.0.255,它可以在192.169.0.100上找到服务器 是否可以获取我的Android手机所连接网络的广播地址?我只打算在我的Wifi网络或其他Wifi网络上使用此应用程序 干杯由于广播IP地址是当前IP地址,但以255结尾,您可以执行以下操作: publ

我正在为我的
Android
手机制作一个客户端服务器应用程序

我在
Python
中创建了一个
UDP
服务器,它可以坐在那里监听连接

我可以像
192.169.0.100
那样直接将服务器
IP
地址放入,它可以很好地发送数据。我还可以输入
192.168.0.255
,它可以在
192.169.0.100
上找到服务器

是否可以获取我的Android手机所连接网络的广播地址?我只打算在我的
Wifi
网络或其他
Wifi
网络上使用此应用程序


干杯

由于广播IP地址是当前IP地址,但以255结尾,您可以执行以下操作:

public String getLocalIpAddress() {
    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) {}
    return null;
}

public static String getBroadcast() throws SocketException {
    System.setProperty("java.net.preferIPv4Stack", "true");
    for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces(); niEnum.hasMoreElements();) {
        NetworkInterface ni = niEnum.nextElement();
        if (!ni.isLoopback()) {
            for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) {
                return interfaceAddress.getBroadcast().toString().substring(1);
            }
        }
    }
    return null;
}
公共字符串getLocalIpAddress(){
试一试{
对于(枚举en=网络接口
.getNetworkInterfaces();en.hasMoreElements();){
NetworkInterface intf=en.nextElement();
对于(枚举Enumeration EnumipAddress=intf.getInetAddresses();EnumipAddress.hasMoreElements();){
InetAddress InetAddress=enumIpAddr.nextElement();
如果(!inetAddress.isLoopbackAddress()){
返回inetAddress.getHostAddress().toString();
}
}
}
}catch(SocketException ex){}
返回null;
}
公共静态字符串getBroadcast()引发SocketException{
setProperty(“java.net.preferIPv4Stack”,“true”);
for(枚举niEnum=NetworkInterface.getNetworkInterfaces();niEnum.hasMoreElements();){
NetworkInterface ni=niEnum.nextElement();
如果(!ni.isLoopback()){
对于(InterfaceAddress InterfaceAddress:ni.getInterfaceAddresses()){
返回interfaceAddress.getBroadcast().toString()子字符串(1);
}
}
}
返回null;
}

以下是一种可行的方法:

    public static String getBroadcast(){
    String found_bcast_address=null;
     System.setProperty("java.net.preferIPv4Stack", "true"); 
        try
        {
          Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces();
          while (niEnum.hasMoreElements())
          {
            NetworkInterface ni = niEnum.nextElement();
            if(!ni.isLoopback()){
                for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses())
                {

                  found_bcast_address = interfaceAddress.getBroadcast().toString();
                  found_bcast_address = found_bcast_address.substring(1);

                }
            }
          }
        }
        catch (SocketException e)
        {
          e.printStackTrace();
        }

        return found_bcast_address;
}
public静态字符串getBroadcast(){
找到字符串\u bcast\u address=null;
setProperty(“java.net.preferIPv4Stack”,“true”);
尝试
{
枚举niEnum=NetworkInterface.getNetworkInterfaces();
while(niEnum.hasMoreElements())
{
NetworkInterface ni=niEnum.nextElement();
如果(!ni.isLoopback()){
对于(InterfaceAddress InterfaceAddress:ni.getInterfaceAddresses())
{
找到了\u bcast\u address=interfaceAddress.getBroadcast().toString();
发现的广播地址=发现的广播地址。子字符串(1);
}
}
}
}
捕获(SocketException e)
{
e、 printStackTrace();
}
返回找到的\u b广播\u地址;
}
来自

private InetAddress getBroadcastAddress()引发IOException{
WifiManager wifi=(WifiManager)getSystemService(Context.wifi\u SERVICE);
DhcpInfo dhcp=wifi.getDhcpInfo();
//以某种方式处理null
int broadcast=(dhcp.ipAddress&dhcp.netmask)|~dhcp.netmask;
字节[]四元组=新字节[4];
对于(int k=0;k<4;k++)
四元组[k]=(字节)(广播>>(k*8));
返回InetAddress.getByAddress(quads);
}

这样做的优点是只需查看WIFI。我知道OP说过“我只会在我的Wifi网络或其他Wifi网络上使用此应用程序。”但值得一提的是,万一其他人需要非Wifi替代品。

一种更简单的方法也许

public static String getBroadcast() throws Exception {
    System.setProperty("java.net.preferIPv4Stack", "true");
    InetAddress inet = InetAddress.getLocalHost();
    NetworkInterface net = NetworkInterface.getByInetAddress(inet);
    InterfaceAddress [] interfaceAddresses = net.getInterfaceAddresses().toArray(new InterfaceAddress[0]);
    if ( interfaceAddresses.length > 0 ) {
        return interfaceAddresses[0].getBroadcast().toString().substring(1);
    } else {
        return "255.255.255";
    }
}

这使得网络掩码是255.255.255.255的假设(可能没有根据)。实际上,您应该获取与检索到的地址关联的网络掩码,然后计算
bcast=ipAddress | ~netmask
,我在想,您将如何实现这样的事情?欢呼“因为广播IP地址是当前IP地址,但以25结尾”。。。不。一个典型的家庭网络的bcast addr为.255,但通常不是这样。子网掩码为255.255.255.128的C类子网192.168.0.1->192.168.0.126的广播地址为:192.168.0.127谢谢,当你删除时,我会更新你的答案:“因为广播IP地址是当前IP地址,但以255结尾”和。。。别忘了,伙计们!同时使用IPv6时,它会引发异常,因为它没有广播地址,getBroadcast()返回null,而toString()会引发异常。(至少在我的windows emulator上是如此。)易于修复,只需检查interfaceAddress.getBroadcast()是否为空。它不应该是“255.255.255.255”吗?
public static String getBroadcast() throws Exception {
    System.setProperty("java.net.preferIPv4Stack", "true");
    InetAddress inet = InetAddress.getLocalHost();
    NetworkInterface net = NetworkInterface.getByInetAddress(inet);
    InterfaceAddress [] interfaceAddresses = net.getInterfaceAddresses().toArray(new InterfaceAddress[0]);
    if ( interfaceAddresses.length > 0 ) {
        return interfaceAddresses[0].getBroadcast().toString().substring(1);
    } else {
        return "255.255.255";
    }
}