Java 生成随机IP地址

Java 生成随机IP地址,java,ip,subnet,Java,Ip,Subnet,我想生成一些随机IP地址。但每次此GeneratePaddress函数返回0.0.0.0字符串作为ipAddress。但每次都应该返回一些随机的ipAddress,而不是0.0.0.0。有什么建议说明为什么会这样吗 private void callingGeoService() { int p1 = 255; int p2 = 0; int p3 = 0; int inc = 5; String ipAddress = generateIPAddres

我想生成一些随机IP地址。但每次此GeneratePaddress函数返回0.0.0.0字符串作为ipAddress。但每次都应该返回一些随机的ipAddress,而不是0.0.0.0。有什么建议说明为什么会这样吗

private void callingGeoService() {
    int p1 = 255;
    int p2 = 0;
    int p3 = 0;
    int inc = 5;

    String ipAddress = generateIPAddress(p1, p2, p3);

    p3 += inc;
    if (p3 > 255) {
        p3 = 0;
        p2 += inc;
        if (p2 > 255) {
            p2 = 0;
            p1--;
            if (p1 <= 0) {
                p1 = 0;
            }
        }
    }
}
我希望以
p1、p2、p3
的形式为
ipAddress
分配一个随机值,最后一位应该是
0
,,使用:

Random r = new Random();
return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);

当然,您可以验证生成的地址是否不是多播等。

假设您实际上并不关心生成的IP地址是否以任何形式有效,那么您就有一个简单的问题

生成地址的代码将参数
p3
p2
设置为小于
255
的值<代码>p1被限制在
255
0
之间

Random r = new Random();
return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);
真正的问题是,将其转换为地址的代码会移动这些值<代码>p1由
24
p2
16
p3
8
。了解调用方法中应用的限制,可以知道
p1
p2
p3
永远不会超过
255
,因此在这种情况下,知道
8
或更多的移位将导致
0
,地址的任何单个元素都不会产生除
0
以外的值,并且最后一个八位字节总是
0
,因此结果地址将是
0.0.0

如果要防止其成为
0.0.0.0
,首先要做的是删除换档操作。这仍然会将最后一个字段保留为
0
,因为它从未设置过,但它应该生成地址


同样,这与地址的状态无关,使用此方法,您将得到广播、多播和仅本地的地址。

当您调用
generateIPAddress(p1,p2,p3)
时,
p1
255
p2
p3
0

Random r = new Random();
return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);
这条线

int b1 = (p1 >> 24) & 0xff;
p1
24位向右移位。换班前,p1为
11111111
。换档结果为
0
。其实你也可以用

int b1 = p1 >> 8;
as
p1
仅开启其8个最低有效位。由于操作在两个
int
操作数之间,因此使用
&0xff
是多余的。所以
b1
0

Random r = new Random();
return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);
p2
p3
与值
0
一起传递,因此移位(通过
16
8
)不会改变它一位,从而导致
b2
b3
也成为
0

Random r = new Random();
return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);
b4
被显式设置为
0

Random r = new Random();
return r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256) + "." + r.nextInt(256);
因此,所有的
b1
b2
b3
b4
都是
0
,您可以从中创建
ip1
ip4
。因此方法
generateIPAddress(p1,p2,p3)
总是返回
0.0.0

然后
p3+=inc
5
添加到
0
p3
中的Reuslt现在是
5

如果(p3>255)
条件
将始终失败,因为
p3
5
,这是
<255

我最近开发了一种可以使用不同类型约束生成随机IPv4地址的方法:

MockNeat mock = MockNeat.threadLocal();

String ipv4 = mock.ipv4s().val();
System.out.println(ipv4);

String ipClassA = mock.ipv4s().type(CLASS_A).val();
System.out.println(ipClassA);

String classAorB = mock.ipv4s().types(CLASS_A, CLASS_B).val();
System.out.println(classAorB);

List<String> ip4s = mock.ipv4s().list(10).val();
System.out.println(ip4s);

使用以下代码生成随机IP地址(请注意,在此代码中,子网掩码具有以下格式):

import java.util.Random;
导入java.util.Scanner;
公共类主类{
公共静态int findRange(int掩码)
{
int x=8-掩模;
整数和=0;
对于(int i=0;i7&&掩码<16)
IP=findfexedpart(IPPrefix,0)+“+”(findfexedpart(IPPrefix,1)+r.nextInt(findRange(mask-8)))+“+r.nextInt(256)+“+r.nextInt(256);
否则如果(遮罩>15和遮罩<24)
IP=findfexedpart(IPPrefix,0)+“+”+findfexedpart(IPPrefix,1)+“+”+(findfexedpart(IPPrefix,2)+r.nextInt(findRange(mask-16)))+”+r.nextInt(256);
否则如果(遮罩>23和遮罩<33)
IP=findfexedpart(IPPrefix,0)+“+”+findfexedpart(IPPrefix,1)+“+”+findfexedpart(IPPrefix,2)+“+”+”(findfexedpart(IPPrefix,3)+r.nextInt(findRange(mask-24));
返回IP;
}
公共静态void main(字符串[]输入输出)
{
System.out.println(“输入IP前缀:”);
扫描仪sc=新的扫描仪(System.in);
字符串IPPrefix=sc.nextLine();
System.out.println(“输入掩码:”);
整数掩码=sc.nextInt();
//在子网掩码中查找随机IP
字符串IP=生成器域IP(IPPrefix,掩码);
系统输出打印项次(IP);
}
}

此函数将帮助您生成无限多个随机IP地址:

        StringBuilder ip = new StringBuilder("xx.xx.xx.xx");
            for (int i=0 ; i <11;i++){

                if (i==2){}
                else if (i==5){}
                else if (i==8){}
                else{
                    Random r = new Random();
                    int random = r.nextInt((9 - 1) + 1) + 1;
                    char c = (char)(random+'0');
                    ip.setCharAt(i, c);
                }

            }

            Log.v("ip","Server IP : "+ip);
StringBuilder ip=新的StringBuilder(“xx.xx.xx.xx”);

对于(int i=0;i我编写了一个短代码,以筛选出中列出的特殊范围(略多于仅基于第一个八位字节):


生成随机ip地址的一种非常简单快速的方法:

import java.util.Random;

public class IpAddressHelper {

     public static String createRandom() {
         return randomNumber() + "." + randomNumber() + "." + randomNumber() + "." + randomNumber();
     }

     public static int randomNumber() {
         return new Random().nextInt((255 - 1) + 1) + 1;
     }
}

Java没有out参数这是什么意思。我不明白?哦,没关系;我以为你想给p1/p2/p3分配一些东西,但我的反应有点太快了。仍然不确定修改(
p3+=inc;
等)是什么意思