您的位置:

以本机当前IP地址为中心的探索

在网络世界里,每台计算机都有唯一的IP地址,这个地址能够标识计算机的位置。我们可以以当前计算机的IP地址为中心,进行一些有趣的探索。

一、IP地址的获取

IP地址是指互联网协议地址,是用于在网络中识别设备的逻辑地址。我们可以通过以下的Java代码获取当前机器的IP地址。

import java.net.InetAddress;
public class GetIp{
  public static void main(String[] args) throws Exception{
    InetAddress address = InetAddress.getLocalHost();
    System.out.println("IP地址:"+address.getHostAddress());
  }
}

代码中,我们调用了Java提供的InetAddress类中的getLocalHost()方法获取本机地址。通过调用getHostAddress()方法获取IP地址。这段代码将会输出当前IP地址。

二、根据IP地址获取地理位置

除了获得IP地址以外,我们还可以通过一些API,将IP地址转换成地理位置信息。下面是一个根据IP地址获取地理位置的Java示例代码:

import net.sf.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class GetAddressByIP {
  public static void main(String[] args) {
    String ip = "114.114.114.114";
    String urlStr = "http://ip-api.com/json/" + ip + "?lang=zh-CN";
    String address = "";
    try {
      URL url = new URL(urlStr);
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      connection.connect();
      InputStream inputStream = connection.getInputStream();
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
      StringBuffer stringBuffer = new StringBuffer();
      String temp = "";
      while ((temp = bufferedReader.readLine()) != null) {
        stringBuffer.append(temp);
      }
      JSONObject jsonObject = JSONObject.fromObject(stringBuffer.toString());
      address = jsonObject.getString("city") + ", " + jsonObject.getString("regionName");
      System.out.println(address);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

代码中,我们调用了百度地图API的服务,将IP地址转换成了地理位置信息。通过访问http://ip-api.com/json/ IP地址 ?lang=zh-CN 获得JSON格式的数据,通过解析数据,我们可以获取城市和地区信息。

三、扫描局域网中的其他主机

在同一个网络下,我们可以通过扫描局域网中的其他主机来了解当前网络中开启的计算机。下面是一个简单的Java代码片段,它可以扫描同一子网中的其他主机。

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

public class ScanIP {
  public static void main(String[] args) {
    Enumeration
    netInterfaces = null;
    try {
      netInterfaces = NetworkInterface.getNetworkInterfaces();
      while (netInterfaces.hasMoreElements()) {
        NetworkInterface networkInterface = netInterfaces.nextElement();
        Enumeration
     inetAddresses = networkInterface.getInetAddresses();
        while (inetAddresses.hasMoreElements()) {
         InetAddress inetAddress = inetAddresses.nextElement();
         String ip = inetAddress.getHostAddress();
         int i = ip.lastIndexOf(".");
         String add = ip.substring(0, i + 1);
         for (int j = 1; j < 255; j++) {
           String testIp = add + j;
           InetAddress address = InetAddress.getByName(testIp);
           boolean reachable = address.isReachable(3000);
           if (reachable) {
             System.out.println(testIp + " is reachable");
           } else {
             System.out.println(testIp + " is not reachable");
           }
         }
       }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
    
   

代码中,我们获取本机所有的网络接口,并对每个接口遍历其子网中的所有IP地址,通过访问IP地址的方式判断该地址是否在使用中。

四、根据IP地址进行端口扫描

在同一个网络下,我们还可以通过端口扫描的方式了解当前网络中开放了哪些端口。下面是一个Java代码示例,通过扫描指定IP的多个端口,获取其端口开放情况。

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
public class PortScan{
  public static void main(String[] args) {
    String ip = "192.168.0.1";
    for (int i = 1; i <= 65535; i++) {
      final int port = i;
      new Thread(new Runnable() {
        @Override
        public void run() {
          Socket socket = new Socket();
          try {
            socket.connect(new InetSocketAddress(ip, port), 10);
            System.out.println(ip + " : " + port + " is open.");
            socket.close();
          } catch (IOException e) {
            //System.out.println(ip + " : " + port + " is closed.");
          }
        }
      }).start();
    }
  }
}

代码中,我们通过扫描IP地址下的所有端口(1~65535),判断其是否开放。开放的端口将会输出相关信息,而未开放的端口将不做处理。

五、IP地址中数字的含义

IP地址是由四个0~255的数字组成,例如:192.168.1.1。这些数字具有一定的含义。其中,前3个数字组成的是网络地址,而最后一个数字则是主机地址。下面是一个Java示例代码,用于解析IP地址中的数字含义。

import java.net.InetAddress;
import java.net.UnknownHostException;
public class IpAnalyze {
  public static void main(String[] args) throws UnknownHostException {
    String ipAddress = "192.168.1.100";
    InetAddress inetAddress = InetAddress.getByName(ipAddress);
    byte[] byteAddress = inetAddress.getAddress();
    int[] intAddress = new int[4];
    for (int i = 0; i < 4; i++) {
      intAddress[i] = byteAddress[i] < 0 ? byteAddress[i] + 256 : byteAddress[i];
    }
    System.out.println("IP地址:" + ipAddress);
    System.out.println("网络地址:" + intAddress[0] + "." + intAddress[1] + "." + intAddress[2]);
    System.out.println("主机地址:" + intAddress[3]);
  }
}

代码中,我们通过调用Java的InetAddress类,将IP地址转换成一个InetAddress对象。通过getAddress()方法获取IP地址的字节形式,然后将其转换为int类型,就可以获得网络地址和主机地址了。

六、总结

本文介绍了以本机当前IP地址为中心的探索,从IP地址的获取、根据IP地址获取地理位置、扫描局域网中的其他主机、根据IP地址进行端口扫描、IP地址中数字的含义等多个方面展示了与IP地址相关的Java代码示例。通过这些Java代码示例,我们可以更深入地了解IP地址,使用Java实现更多有趣的网络应用。