Finden Sie die Adressklasse und den Adresstyp aus der IP-Adresse mit Java [Abkochung Nr. 2]

zunaechst

Ich habe mich für einen Cloud-Server entschieden und zum Glück eine globale IP erhalten. Um die Verarbeitung zwischen dem internen PC (private IP) und dem Cloud-Server (globale IP) zu trennen, ist es jetzt möglich, die Adressklasse und die private IP von der IP zu bestimmen.

(Originalgeschichte) Abrufen der Adressklasse und des Adresstyps von der IP-Adresse mit Java

(Referenz) IP-Adresse-Wikipedia

Implementierung

IPAddressInfo.java


public class IPAddressInfo {

	public enum AddressClass{
		ClassA(128) {
			@Override
			protected boolean isPrivate(int first, int second) {
				return first == 10;
			}
		},
		ClassB(128 + 64) {
			@Override
			protected boolean isPrivate(int first, int second) {
				return first == 172 && (16 <= second && second <= 31);
			}
		},
		ClassC(128 + 64 + 32) {
			@Override
			protected boolean isPrivate(int first, int second) {
				return first == 192 && second == 168;
			}
		},
		ClassD(128 + 64 + 32 + 16) {
			@Override
			protected boolean isPrivate(int first, int second) {
				return false;
			}
		},
		ClassE(256) {
			@Override
			protected boolean isPrivate(int first, int second) {
				return false;
			}
		},;

		private final int outOfNo;

		/**
		 *Fünf Adressklassen von IP-Adressen.
		 * @param outOfNo Die erste IP der folgenden Adressklasse
		 */
		private AddressClass(int outOfNo){
			this.outOfNo = outOfNo;
		}

		protected abstract boolean isPrivate(int first, int second);
	}

	public AddressClass getAddressClass(int first){
		return  Arrays.stream(AddressClass.values()).filter(p -> first < p.outOfNo).findFirst().orElseThrow(() -> new IllegalArgumentException("Kein Trinkgeld:" + first));
	}

	public AddressClass getAddressClass(String ip){
		List<String> addressList = Arrays.asList(ip.split("\\."));
		return getAddressClass(Integer.valueOf(addressList.get(0)));
	}

	public boolean isPrivate(String ip){
		List<String> addressList = Arrays.asList(ip.split("\\."));
		int first = Integer.valueOf(addressList.get(0));
		int second = Integer.valueOf(addressList.get(1));
		return getAddressClass(first).isPrivate(first, second);
	}
}

Prüfung

IPAddressInfo.java


	@Test
	public void getAddressClass(){
		assertThat(getAddressClass("0.0.0.0"), is(AddressClass.ClassA));
		assertThat(getAddressClass("10.0.0.0"), is(AddressClass.ClassA));
		assertThat(getAddressClass("10.255.255.255"), is(AddressClass.ClassA));
		assertThat(getAddressClass("127.255.255.255"), is(AddressClass.ClassA));

		assertThat(getAddressClass("128.0.0.0"), is(AddressClass.ClassB));
		assertThat(getAddressClass("172.16.0.0"), is(AddressClass.ClassB));
		assertThat(getAddressClass("172.31.255.255"), is(AddressClass.ClassB));
		assertThat(getAddressClass("191.255.255.255"), is(AddressClass.ClassB));

		assertThat(getAddressClass("192.0.0.0"), is(AddressClass.ClassC));
		assertThat(getAddressClass("192.168.0.0"), is(AddressClass.ClassC));
		assertThat(getAddressClass("192.168.255.255"), is(AddressClass.ClassC));
		assertThat(getAddressClass("223.255.255.255"), is(AddressClass.ClassC));

		assertThat(getAddressClass("224.0.0.0"), is(AddressClass.ClassD));
		assertThat(getAddressClass("239.255.255.255"), is(AddressClass.ClassD));

		assertThat(getAddressClass("240.0.0.0"), is(AddressClass.ClassE));
		assertThat(getAddressClass("255.255.255.255"), is(AddressClass.ClassE));
	}

	@Test
	public void isPrivate(){
		assertThat(isPrivate("0.0.0.0"), is(false));
		assertThat(isPrivate("10.0.0.0"), is(true));
		assertThat(isPrivate("10.255.255.255"), is(true));
		assertThat(isPrivate("127.255.255.255"), is(false));

		assertThat(isPrivate("128.0.0.0"), is(false));
		assertThat(isPrivate("172.16.0.0"), is(true));
		assertThat(isPrivate("172.31.255.255"), is(true));
		assertThat(isPrivate("191.255.255.255"), is(false));

		assertThat(isPrivate("192.0.0.0"), is(false));
		assertThat(isPrivate("192.168.0.0"), is(true));
		assertThat(isPrivate("192.168.255.255"), is(true));
		assertThat(isPrivate("223.255.255.255"), is(false));

		assertThat(isPrivate("224.0.0.0"), is(false));
		assertThat(isPrivate("239.255.255.255"), is(false));

		assertThat(isPrivate("240.0.0.0"), is(false));
		assertThat(isPrivate("255.255.255.255"), is(false));
	}

	@Test(expected=IllegalArgumentException.class)
	public void error(){
		getAddressClass("256.255.255.255");
	}

Recommended Posts

Finden Sie die Adressklasse und den Adresstyp aus der IP-Adresse mit Java [Abkochung Nr. 2]
Suchen Sie die Adressklasse und den Adresstyp aus der IP-Adresse mit Java
Land von IP-Adresse abrufen (Java)
[Java] So konvertieren Sie vom Typ String in den Pfadtyp und erhalten den Pfad
[Java] Ermitteln Sie das Datum mit der LocalDateTime-Klasse
<java> Teilen Sie die Adresse vor und nach der Adresse mit einem regulären Ausdruck
[Java] Stellen Sie die Zeit im Browser mit jsoup ein
Inkrementiert durch das dritte Argument der iterierten Methode der aus Java9 hinzugefügten Stream-Klasse
"TCP / IP JAVA-Netzwerkprogrammierung aus den Grundlagen verstanden" Kompiliert mit Eclipse. Debuggen mit Wireshark.
Fühlen Sie den Grundtyp und Referenztyp leicht mit Rubin
Schreiben Sie ABNF in Java und geben Sie die E-Mail-Adresse weiter
Java-Sprache aus der Sicht von Kotlin und C #
[Java] Holen Sie sich das Datum 10 Tage später mit der Calendar-Klasse
Fühlen Sie den Grundtyp und Referenztyp leicht mit Rubin 2
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor
Feld für den Java-Klassentyp
Ich möchte mit Java8 StreamAPI redu () einen anderen Typ als das Eingabeelement zurückgeben.
JSON in Java und Jackson Teil 1 Gibt JSON vom Server zurück
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
Was ist die LocalDateTime-Klasse? [Java-Anfänger] -Datum und Zeitklasse-
Implementieren Sie die Java-Schnittstelle in der JRuby-Klasse und rufen Sie sie von Java aus auf
Stellen Sie Datum und Uhrzeit aus der Zeichenfolge mit POI ein
Finden Sie alle Zeitzonen-IDs heraus, die von der Java TimeZone-Klasse unterstützt werden
Korrigieren Sie den Zeichencode in Java und lesen Sie von der URL
[Java] Überprüfen Sie den Unterschied zwischen orElse und orElseGet mit IntStream
Definition und Instanziierung von Java-Klassen
Suchen und Ausführen einer Methode aus einer Instanz mit Verarbeitung (Java)
Installieren Sie das memcached Plugin unter MySQL und greifen Sie von Java aus zu
So legen Sie die IP-Adresse und den Hostnamen von CentOS8 fest
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
[Android, Java] Methode zum Ermitteln des abgelaufenen Datums aus zwei Daten
Hinweis Nr. 2 "Erstellen eines Suchverlaufs mit ArrayList und HashSet" [Java]
Lesen Sie die ersten 4 Bytes der Java-Klassendatei und geben Sie CAFEBABE aus
Vom jungen Java (3 Jahre) bis zu Node.js (4 Jahre). Und der Eindruck, nach Java zurückzukehren
Lesen Sie Druck und Temperatur von Raspberry Pi 3 & BMP180 mit Java ab
Erstellen Sie einen Kalender aus der Kalenderklasse, indem Sie das Jahr und den Monat angeben
[Gradle] Erstellen Sie ein Java-Projekt mit einer Konfiguration, die von der Konvention abweicht
Überlegungen und Gegenmaßnahmen, dass SSL-Kommunikationsfehler häufiger in Java 11 auftreten