P2P-Chat über UDP nach RNPP-1.0-Spezifikation. Java 25, ein-Klassen-Architektur
mit zentraler Node-Komponente. Ohne Framework.
mvn clean packageErzeugt target/rnpp-chat-1.0.0-SNAPSHOT.jar (mit allen Dependencies).
java -jar target/rnpp-chat-1.0.0-SNAPSHOT.jar <username> [--ip <ipv4>]Beispiele:
# Eigene IP automatisch erkennen
java -jar target/rnpp-chat-1.0.0-SNAPSHOT.jar alice
# Eigene IP explizit setzen (bei Multi-NIC empfohlen)
java -jar target/rnpp-chat-1.0.0-SNAPSHOT.jar alice --ip 192.168.1.10join [neighbour-ip ...] Netz beitreten
leave Netz verlassen
send <ip> <text...> Textnachricht senden
sendfile <ip> <path> Datei senden
list Teilnehmer anzeigen
help Hilfe
$ java -jar rnpp-chat-1.0.0-SNAPSHOT.jar alice
RNPP chat started as alice @ 192.168.1.10
Type 'help' for commands.
rnpp> list
IP User Hops
----------------------------------------------
192.168.1.10 alice 0
# In einem anderen Terminal/Rechner:
$ java -jar rnpp-chat-1.0.0-SNAPSHOT.jar bob --ip 192.168.1.11
rnpp> join 192.168.1.10
rnpp> list
IP User Hops
----------------------------------------------
192.168.1.11 bob 0
192.168.1.10 alice 1
rnpp> send 192.168.1.10 Hallo Alice
rnpp> sendfile 192.168.1.10 ./test.txt
Empfangene Dateien landen im downloads/ Unterordner.
Diese Variante weicht in einigen Punkten von der Standardspez ab:
- ACK statt NACK für alle Unicast-Pakete (außer ACK selbst). Bestätigung pro Chunk.
- Max 5 Wiederholungen im Intervall von 2 Sekunden je unbestätigtem Paket.
- Hop > 15 wird verworfen (count-to-infinity-Schutz).
- List sendet nur NON und DEL (kein ADD). Neue Peers propagieren über reguläre NON-Updates.
- HopCount wird erst dekrementiert, dann ausgewertet beim Forwarding.
- 60 Sekunden Timeout für unvollständige eingehende Transfers.
- Dedup nur für Broadcasts (Hello, List, Terminate). Unicast wird nicht dedupliziert — sonst könnten Retransmits nicht funktionieren.
src/main/java/de/haw/rnpp/
├── Main.java REPL + manuelles Wiring
├── application/
│ └── Node.java Zentrale Protokoll-Logik
├── domain/
│ ├── packet/ Header, Packet, PacketType, IDs, payload/*
│ ├── peer/ PeerIdentity, Username
│ ├── routing/ RoutingTable, RoutingEntry, EntryStatus
│ └── transfer/ IncomingTransfer, PendingPacket, Keys
└── infrastructure/
├── UdpGateway.java DatagramSocket-Wrapper
├── UdpListener.java Empfangs-Loop auf virtuellem Thread
└── codec/ Header- und Payload-Codecs
- JDK 25 (für virtuelle Threads + Pattern Matching)
- Maven 3.8+
- UDP-Port 1337 offen
- Alle Peers im selben Subnetz (für Broadcasts)