Trouvez la classe d'adresse et le type d'adresse à partir de l'adresse IP avec Java

【Aperçu】

Les informations suivantes sont affichées à partir de l'adresse IP spécifiée par l'argument (un seul). ・ Classe d'adresse (classe A ou classe B ou classe C ou classe D) ・ Adresse IP globale ou adresse IP privée

Il est téléchargé sur GitHub. → ipAddressInfo Je ne l'ai pas tellement testé, donc il y a peut-être un mauvais codage ... Si vous trouvez quelque chose qui ne va pas avec le code ou une amélioration, veuillez nous en informer dans les commentaires ou modifier la demande.

【code】

Main.java


package pk;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

	private static final String CLASS_A_PREFIX = "0";
	private static final String CLASS_B_PREFIX = "10";
	private static final String CLASS_C_PREFIX = "110";
	private static final String CLASS_D_PREFIX = "1110";

	public static void main(String[] args) {
		//Vérification des arguments
		if (args.length != 1) {
			System.out.println("Spécifiez l'adresse IP dans l'argument.");
			System.exit(1);
		}

		//Expression régulière pour la détermination de l'adresse IP
		Pattern pattern = Pattern.compile(
				"(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])");
		Matcher matcher = pattern.matcher(args[0]);

		if (matcher.find()) {
			List<String> addressList = new ArrayList<>();
			addressList = Arrays.asList(args[0].split("\\."));
			String addressClass = getIpAdressClass(getBinaryAddress(addressList.get(0)));

			switch (addressClass) {
				case CLASS_A_PREFIX:
					if (isPrivateAddress(addressList, CLASS_A_PREFIX)) {
						showResult("Classe A", "Adresse IP privée");
					} else {
						showResult("Classe A", "Adresse IP globale");
					}
					break;
				case CLASS_B_PREFIX:
					if (isPrivateAddress(addressList, CLASS_B_PREFIX)) {
						showResult("Classe B", "Adresse IP privée");
					} else {
						showResult("Classe B", "Adresse IP globale");
					}
					break;
				case CLASS_C_PREFIX:
					if (isPrivateAddress(addressList, CLASS_C_PREFIX)) {
						showResult("Classe C", "Adresse IP privée");
					} else {
						showResult("Classe C", "Adresse IP globale");
					}
					break;
				case CLASS_D_PREFIX:
					System.out.println("Classe D.");
					break;
				default:
					System.out.println("Une adresse qui n'appartient à aucune classe.");
					break;
			}
		} else {
			System.out.println("Il ne suit pas le format de l'adresse IP.");
			System.exit(1);
		}
	}

	/**
	 *Convertir de décimal en binaire
	 * @param decimalAddress Adresse décimale
	 * @return Valeur obtenue en convertissant un nombre décimal en nombre binaire
	 */
	private static String getBinaryAddress(String decimalAddress) {
		return String.format("%8s", Integer.toBinaryString(Integer.valueOf(decimalAddress))).replace(" ", "0");
	}

	/**
	 *Déterminez à quelle classe il appartient
	 * @param binaryAddress Adresse binaire
	 * @Préfixe pour chaque classe de retour, si elle n'appartient à aucune classe"1"rends le
	 */
	private static String getIpAdressClass(String binaryAddress) {
		if (CLASS_A_PREFIX.equals(binaryAddress.substring(0, 1))) {
			return CLASS_A_PREFIX;
		} else if (CLASS_B_PREFIX.equals(binaryAddress.substring(0, 2))) {
			return CLASS_B_PREFIX;
		} else if (CLASS_C_PREFIX.equals(binaryAddress.substring(0, 3))) {
			return CLASS_C_PREFIX;
		} else if (CLASS_D_PREFIX.equals(binaryAddress.substring(0, 4))) {
			return CLASS_D_PREFIX;
		} else {
			return "1";
		}
	}

	/**
	 *Déterminez si l'adresse IP appartenant à la classe d'adresses de la classe A à la classe C est une IP globale ou une IP privée
	 * @param classPrefix
	 * @return Renvoie vrai pour les adresses IP privées, faux sinon
	 */
	private static boolean isPrivateAddress(List<String> addressList, String classPrefix) {
		int firstSet = Integer.valueOf(addressList.get(0));
		int secondSet = Integer.valueOf(addressList.get(1));

		switch (classPrefix) {
			case CLASS_A_PREFIX:
				//La plage d'adresses IP privées de classe A est
				// 10.0.0.0 ~ 10.255.255.255
				if (firstSet == 10) {
					return true;
				}
				break;
			case CLASS_B_PREFIX:
				//La plage d'adresses IP privées de classe B est
				// 172.16.0.0 ~ 172.31.255.255
				if (firstSet == 172 && (16 <= secondSet && secondSet <= 31)) {
					return true;
				}
				break;
			case CLASS_C_PREFIX:
				//La plage d'adresses IP privées de classe C est
				// 192.168.0.0 ~ 192.168.255.255
				if (firstSet == 192 && secondSet == 168) {
					return true;
				}
				break;
			case CLASS_D_PREFIX:
				//La classe D est pour la multidiffusion, il n'y a donc pas de concept de global ou privé
				break;
			default:
				return false;
		}
		return false;
	}

	/**
	 *Afficher le résultat d'identification de l'adresse IP
	 * @param addressClass nom de classe d'adresse IP
	 * @param addressStatus Adresse IP globale ou adresse IP privée
	 */
	private static void showResult(String addressClass, String addressStatus) {
		System.out.println(addressClass + "Et" + addressStatus + "est.");
	}
}

[Exemple d'exécution]

> java pk.Main 208.77.188.166
Classe C et adresse IP globale.

【référence】

Correspondance IP avec l'expression régulière -Regexp Expression régulière qui oblige Hidemaru à rechercher l'adresse IP Adresse IP-Wikipedia [2018 [Spring] [Autumn] Applied Information Engineer Passed Textbook (Information Processing Engineer Examination)](https://www.amazon.co.jp/%E5%B9%B3%E6%88%9030% E5% B9% B4% E5% BA% A6% E3% 80% 90% E6% 98% A5% E6% 9C% 9F% E3% 80% 91% E3% 80% 90% E7% A7% 8B% E6% 9C% 9F% E3% 80% 91% E5% BF% 9C% E7% 94% A8% E6% 83% 85% E5% A0% B1% E6% 8A% 80% E8% A1% 93% E8% 80% 85-% E5% 90% 88% E6% A0% BC% E6% 95% 99% E6% 9C% AC-% E6% 83% 85% E5% A0% B1% E5% 87% A6% E7% 90% 86% E6% 8A% 80% E8% A1% 93% E8% 80% 85% E8% A9% A6% E9% A8% 93-% E5% A4% A7% E6% BB% 9D-% E3% 81% BF% E3% 82% 84% E5% AD% 90 / dp / 4774193151 / ref = sr_1_2? Ie = UTF8 & qid = 1517733175 & sr = 8-2 & mots-clés =% E5% BF% 9C% E7% 94% A8% E6% 83% 85 % E5% A0% B1% E6% 8A% 80% E8% A1% 93% E8% 80% 85)

[Coin bonus]

Prenez la qualification d'information sur l'application en avril de cette année. Si vous réussissez, vous obtiendrez une récompense de l'entreprise, alors achetez un costume et une PS Vita!

Recommended Posts

Trouvez la classe d'adresse et le type d'adresse à partir de l'adresse IP avec Java
Trouvez la classe d'adresse et le type d'adresse à partir de l'adresse IP avec Java [décoction n ° 2]
Obtenir le pays à partir de l'adresse IP (Java)
[Java] Comment convertir du type String en type Path et obtenir le chemin
[Java] Obtenez la date avec la classe LocalDateTime
<java> Fractionner l'adresse avant et après l'adresse avec une expression régulière
[Java] Réglez l'heure depuis le navigateur avec jsoup
Incrémenté du troisième argument de la méthode iterate de la classe Stream ajoutée depuis Java9
Champ de type de classe Java
Ressentez facilement le type de base et le type de référence avec ruby
Écrivez ABNF en Java et transmettez l'adresse e-mail
Langage Java du point de vue de Kotlin et C #
[Java] Obtenez la date 10 jours plus tard avec la classe Calendar
Ressentez facilement le type de base et le type de référence avec ruby 2
Préparer l'environnement pour java11 et javaFx avec Ubuntu 18.4
"Programmation réseau TCP / IP JAVA comprise depuis les bases" Compilé avec Eclipse. Déboguer avec Wireshark.
JSON en Java et Jackson Partie 1 Renvoyer JSON à partir du serveur
Différence entre Java et JavaScript (comment trouver la moyenne)
Qu'est-ce que la classe LocalDateTime? [Java débutant] -Date et classe d'heure-
Implémentez l'interface Java dans la classe JRuby et appelez-la depuis Java
Réglez la date et l'heure à partir de la chaîne de caractères avec POI
Définition et instanciation de classe Java
Découvrez tous les ID de fuseau horaire pris en charge par la classe Java TimeZone
Corrigez le code de caractère en Java et lisez à partir de l'URL
[Java] Vérifiez la différence entre orElse et orElseGet avec IntStream
Je veux renvoyer un type différent de l'élément d'entrée avec Java8 StreamAPI Reduce ()
Rechercher et exécuter une méthode à partir d'une instance avec traitement (java)
Installez le plugin memcached sur MySQL et accédez à partir de Java
Comment définir l'adresse IP et le nom d'hôte de CentOS8
Je veux revenir à l'écran précédent avec kotlin et java!
[Android, Java] Méthode pour trouver la date écoulée à partir de deux dates
Lire les 4 premiers octets du fichier de classe Java et générer CAFEBABE
De Java naissant (3 ans) à Node.js (4 ans). Et l'impression de retourner à Java
Lire la pression et la température de Raspberry Pi 3 et BMP180 avec Java
Créez un calendrier à partir de la classe Calendar en spécifiant l'année et le mois
[Gradle] Construisez un projet Java avec une configuration différente de la convention
Créer une classe immuable avec JAVA
Appeler la classe scellée de Kotlin depuis Java
Utiliser java avec MSYS et Cygwin
Traçage distribué avec OpenCensus et Java
Obtenir TypeElement et TypeMirror à partir de la classe
Installez Java et Tomcat avec Ansible
Coder Java depuis Emacs avec Eclim
Adresse IP interférée avec le pont Docker
Utilisez JDBC avec Java et Scala.
Classe StringBuffer et StringBuilder en Java
java (utilisez le type de classe pour le champ)
Suivez le lien avec Selenium (Java)
Sortie PDF et TIFF avec Java 8
Travailler avec des feuilles de calcul Google à partir de Java
La route de JavaScript à Java
Crypter avec Java et décrypter avec C #
Prise en compte et contre-mesures selon lesquelles les erreurs de communication SSL sont plus susceptibles de se produire à partir de Java 11
Déclarez une méthode qui a une valeur de retour Java avec le type de données de valeur de retour
[Java] Obtenir et gérer Json à partir d'une URL avec une API standard (javax.script)
Exprimons le résultat de l'analyse du code d'octet Java dans un diagramme de classes
Utilisation de Java avec AWS Lambda-Implementation Tips - Obtenir le nom de l'instance à partir de la réaction et de l'ID d'instance
[Java] Créez un fichier jar compressé et non compressé avec la commande jar
Transition d'activité avec refactoring de classe JAVA et instance expérimentée côté Android
Utilisez docker-compose pour spécifier votre adresse IP préférée sur le réseau hôte et lancez-la.