java IP地址网段计算的示例代码

根据IP地址与字段掩码计算网段最大最小IP

package c04;
import java.net.UnknownHostException;

public class IPNetworkSegmentCalculation {
  public static void main(String[] args) throws UnknownHostException {
    String ip = "192.168.126.2";
    String mask = "255.255.255.0";
    findMask();
  }
  public static void findMask(){
    String mask = "255.255.255.0";
    String ip = "192.168.126.2";
    String[] ipArray =  ip.split("[.]");
    String[] maskArray = mask.split("[.]");

    String minIp = "";
    String maxIp = "";
    int subMask = 0;
    for(int i=0 ;i < maskArray.length ; i++){
      int maskTmp = Integer.valueOf(maskArray[i]);
      int ipTmp = Integer.valueOf(ipArray[i]);
      int mi = maskTmp&ipTmp;

      //System.out.println("==============="+maskTmp+" "+ipTmp);
      if(ipTmp == mi && maskTmp==255){
        minIp = minIp + ipTmp+"." ;
        maxIp = maxIp + ipTmp+"." ;
        subMask = subMask + 8;
      }else{
        minIp = minIp + mi+"." ;
        maxIp = maxIp + maxNetSeg(Integer.toBinaryString(maskTmp),mi)+".";
        subMask = subMask + subMaskNum(Integer.toBinaryString(maskTmp));
      }

    }

    minIp = minIp.substring(0,minIp.length()-1);
    maxIp = maxIp.substring(0,maxIp.length()-1);
    System.out.println("minip "+minIp);
    System.out.println("maxip "+maxIp);
    System.out.println("mask "+subMask);
  }
  private static int calculate(int n) {
    if (n == 0)
      return 1;
    return 2 * calculate(n - 1);
  }

  private static Integer maxNetSeg(String s1,int mi){
    s1 = new StringBuffer(s1).reverse().toString();

    if(s1.indexOf("1")!=-1){
      int i = s1.indexOf("1");
      return mi+calculate(i);
    }else {
      return 255;
    }

  }
  private static Integer subMaskNum(String s1){
    if(s1.lastIndexOf("1")!=-1){
      int i = s1.lastIndexOf("1") + 1;
      return i;
    }
    return 0;

  }
}

Java根据网段计算子网掩码,起始IP,结束IP

/**
 * IP的相关计算
 * @author zengchaowang
 * @version 1.0
 *
 */
public class IpCaculate {

	/**
	 * 根据掩码位数计算掩码
	 * @param maskIndex 掩码位
	 * @return 子网掩码
	 */
	public static String getNetMask(String maskIndex) {
		StringBuilder mask = new StringBuilder();
		Integer inetMask = 0;
		try {
			inetMask = Integer.parseInt(maskIndex);
		} catch (NumberFormatException e) {
			System.out.println(e.getMessage());
			return null;
		}
		if (inetMask > 32) {
			return null;
		}
		// 子网掩码为1占了几个字节
		int num1 = inetMask / 8;
		// 子网掩码的补位位数
		int num2 = inetMask % 8;
		int array[] = new int[4];
		for (int i = 0; i < num1; i++) {
			array[i] = 255;
		}
		for (int i = num1; i < 4; i++) {
			array[i] = 0;
		}
		for (int i = 0; i < num2; num2--) {
			array[num1] += 1 << 8 - num2;
		}
		for (int i = 0; i < 4; i++) {
			if (i == 3) {
				mask.append(array[i]);
			} else {
				mask.append(array[i] + ".");
			}
		}
		return mask.toString();
	}

	/**
	 * 根据网段计算起始IP 网段格式:x.x.x.x/x
	 * 一个网段0一般为网络地址,255一般为广播地址.
	 * 起始IP计算:网段与掩码相与之后加一的IP地址
	 * @param segment 网段
	 * @return 起始IP
	 */
	public static String getStartIp(String segment) {
		StringBuffer startIp = new StringBuffer();
		if (segment == null) {
			return null;
		}
		String arr[] = segment.split("/");
		String ip = arr[0];
		String maskIndex = arr[1];
		String mask = IpCaculate.getNetMask(maskIndex);
		if (4 != ip.split("\\.").length || mask == null) {
			return null;
		}
		int ipArray[] = new int[4];
		int netMaskArray[] = new int[4];
		for (int i = 0; i < 4; i++) {
			try {
				ipArray[i] = Integer.parseInt(ip.split("\\.")[i]);
				netMaskArray[i] = Integer.parseInt(mask.split("\\.")[i]);
				if (ipArray[i] > 255 || ipArray[i] < 0 || netMaskArray[i] > 255 || netMaskArray[i] < 0) {
					return null;
				}
				ipArray[i] = ipArray[i] & netMaskArray[i];
				if(i==3){
					startIp.append(ipArray[i]+1);
				}else{
					startIp.append(ipArray[i]+".");
				}
			} catch (NumberFormatException e) {
				System.out.println(e.getMessage());
			}
		}
		 return startIp.toString();
	}

	/**
	 * 根据网段计算结束IP
	 * @param segment
	 * @return 结束IP
	 */
	public static String getEndIp(String segment) {
		StringBuffer endIp=new StringBuffer();
		String startIp = getStartIp(segment);
		if (segment == null) {
			return null;
		}
		String arr[] = segment.split("/");
		String maskIndex = arr[1];
		//实际需要的IP个数
	  int hostNumber = 0;
	  int startIpArray[] = new int[4];
		try {
			hostNumber=1<<32-(Integer.parseInt(maskIndex));
			for (int i = 0; i <4; i++) {
				startIpArray[i] = Integer.parseInt(startIp.split("\\.")[i]);
		    if(i == 3){
		    	startIpArray[i] = startIpArray[i] - 1;
		      break;
		    }
		  }
			startIpArray[3] = startIpArray[3] + (hostNumber - 1);
		} catch (NumberFormatException e) {
			System.out.println(e.getMessage());
		}

		if(startIpArray[3] >255){
	    int k = startIpArray[3] / 256;
	    startIpArray[3] = startIpArray[3] % 256;
	    startIpArray[2] = startIpArray[2] + k;
	  }
	  if(startIpArray[2] > 255){
	    int j = startIpArray[2] / 256;
	    startIpArray[2] = startIpArray[2] % 256;
	    startIpArray[1] = startIpArray[1] + j;
	      if(startIpArray[1] > 255){
	        int k = startIpArray[1] / 256;
	        startIpArray[1] = startIpArray[1] % 256;
	        startIpArray[0] = startIpArray[0] + k;
	      }
	    }
	  for(int i = 0; i < 4; i++){
	    if(i == 3){
	    	startIpArray[i] = startIpArray[i] - 1;
	    }
	    if("" == endIp.toString()||endIp.length()==0){
	    	endIp.append(startIpArray[i]);
	    }else{
	    	endIp.append("." + startIpArray[i]);
	    }
	  }
		return endIp.toString();
	}
}

根据网段计算起始IP 网段格式:x.x.x.x/x

网段内需要的IP数量为:2的(32-掩码位)次方个。

因为一个网段0一般为网络地址,255一般为广播地址, 所以第一个可用IP起始IP计算:网段与掩码相与之后加一的IP地址,结束IP为通过计算需要的所有IP数然后做累加运算,超过256则进位进行运算。

到此这篇关于java IP地址网段计算的示例代码的文章就介绍到这了,更多相关java IP地址计算内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java 判断IP地址的合法性实例详解

    Java 判断IP地址的合法性 0.前言 有时候我们要对用户输入的IP地址进行校验,判断这个IP地址是不是一个合法的IP地址. 1.实现思路 最简单的实现方法是构造一个正则表达式.判断用户的输入与正则表达式是否匹配.若匹配则是正确的IP地址,否则不是正确的IP地址.这里的难点是如何构造出一个可用的正则表达式. 2.Java实现 /** * Created by HUPENG on 2016/9/26. */ public class Tool { /** * 判断IP地址的合法性,这里采用了正则

  • java 伪造http请求ip地址的方法

    最近做接口开发,需要跟第三方系统对接接口,基于第三方系统接口的保密性,需要将调用方的请求IP加入到他们的白名单中.由于我们公司平常使用的公网的IP是不固定的,每次都需要将代码提交到固定的服务器上(服务器IP加入了第三方系统的白名单),频繁的修改提交合并代码和启动服务器造成了额外的工作量,给接口联调带来了很大的阻碍. 正常的http请求 我们正常发起一个http的请求如下: import org.apache.http.HttpEntity; import org.apache.http.clie

  • java中通过网卡名称获取IP地址

    复制代码 代码如下: package me.xuzs.sso.test; import java.net.InetAddress;import java.net.NetworkInterface;import java.net.SocketException;import java.util.Enumeration; public class InternetTest { public static void main(String[] args) {        String netCard

  • java中获取当前服务器的Ip地址的方法

    1.tomcat是一款免费的开源Web服务器,如果部署在本地,那么对应的那么为localhost,对应地址为127.0.0.1. 例子:可以通过http://localhost:8080/项目root值访问,也可以通过http://127.0.0.1/项目root值访问. 如果部署在服务器(linux)系统类,则需要通过服务器的Ip地址进行访问. 2.下面说说怎么获取Ip地址: 获取本地的Ip地址: public static void main(String[] args) { try { I

  • JAVA如何获取客户端IP地址和MAC地址

    本文介绍了JAVA如何获取客户端IP地址和MAC地址 ,分享给大家,具体如下: 1.获取客户端IP地址 public String getIp(HttpServletRequest request) throws Exception { String ip = request.getHeader("X-Forwarded-For"); if (ip != null) { if (!ip.isEmpty() && !"unKnown".equalsIg

  • java实现根据ip地址获取地理位置

    最近项目某个功能需要根据ip地址从第三方接口获取详细的地理位置,从网上找了很多例子,主要接口有新浪的,淘宝的,腾讯的.试了淘宝的,如果是数量级小的还可以,如果数量级达到上十万级就速度慢了,会导致系统崩溃.下面例子是新浪的,例子不是适合每个项目,需要改一下. /** ipSearchUrl=http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=(这是新浪的接口地址) 在项目中新浪的接口地址没有直接写死,而是去读属性文件. *

  • Java中使用HttpRequest获取用户真实IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid,nginx等反向代理软件就不能获取到客户端的真实IP地址了. 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.jb51.net / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110

  • java根据ip地址获取详细地域信息的方法

    互联网有很多接口可以实现通过ip查询到具体的位置,如下: 通过淘宝IP地址库获取IP位置 请求接口(GET):http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串] 响应信息:(json格式的)国家 .省(自治区或直辖市).市(县).运营商 返回数据格式: {"code":0,"data":{"ip":"210.75.225.254","country"

  • java实现ip地址与十进制数相互转换

    先看实例 代码如下 复制代码 代码如下: classip { privatestaticlongiptolong(stringstrip) //将127.0.0.1形式的ip地址转换成10进制整数,这里没有进行任何错误处理 { intj=0; inti=0; long[]ip=newlong[4]; intposition1=strip.indexof("."); intposition2=strip.indexof(".",position1+1); intpos

  • Java判断本机IP地址类型的方法

    复制代码 代码如下: package net; import java.net.*; /*  *  getAddress方法和getHostAddress类似,它们的唯一区别是getHostAddress方法返回的是字符串形式的IP地址,  *  而getAddress方法返回的是byte数组形式的IP地址.  *  Java中byte类型的取值范围是-128?127.如果返回的IP地址的某个字节是大于127的整数,在byte数组中就是负数.  *  由于Java中没有无符号byte类型,因此,

  • Java判断IP地址为内网IP还是公网IP的方法

    本文实例讲述了Java判断IP地址为内网IP还是公网IP的方法.分享给大家供大家参考.具体分析如下: tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下: 10.0.0.0/8:10.0.0.0-10.255.255.255 172.16.0.0/12:172.16.0.0-172.31.255.255 192.168.0.0/16:192.168.0.0-192.168.255.255 那么,直接上代码吧: 复制代码 代码如下: public static boolea

随机推荐