Ich möchte UDP Hole Punching mit zwei Clients mit Hilfe eines Servers mit einer statischen IP durchführen. Der Server wartet auf die beiden Clients auf Port 7070 und 7071. Danach sendet er die IP-Adresse und den Port miteinander. Dieser Teil funktioniert gut. Aber ich kann keine Kommunikation zwischen den beiden Clients herstellen. Ich habe den Code in verschiedenen WLAN-Netzwerken und im 3G-Mobilfunknetz ausprobiert. Das Client-Programm löst die IO-Exception "Keine Route zum Host" aus. Der Client-Code wird für beide Clients verwendet. Einmal mit Port 7070 und einmal mit 7071 ausgeführt.
Glauben Sie, ich habe das UDP-Lochungskonzept richtig implementiert? Irgendwelche Ideen, damit es funktioniert? Hier ist der Server-Code zuerst, gefolgt von dem Client-Code.
Danke für Ihre Hilfe.
Code des Servers:
%Vor%Code des Kunden
%Vor%UPDATE Der Code funktioniert im Allgemeinen. Ich habe es jetzt in zwei verschiedenen Heimnetzwerken ausprobiert und es funktioniert. Aber es funktioniert nicht in meinem 3G- oder Universitätsnetzwerk. In 3G habe ich verifiziert, dass das NAT die beiden Ports (den Client-Port und den dem Router zugewiesenen Port) wieder zusammen mappt, selbst nach dem Schließen und Öffnen des Client-Sockets. Hat jemand eine Idee warum es dann nicht funktioniert?
UDP-Lochung kann nicht mit allen Arten von NAT erreicht werden. Es gibt keinen universellen oder zuverlässigen Weg für alle Arten von NAT. Es ist sogar sehr schwierig für symmetrisches NAT.
Abhängig vom NAT-Verhalten kann die Port-Zuordnung für verschiedene Geräte, die die UDP-Pakete senden, unterschiedlich sein. Wenn A ein UDP-Paket an B sendet, kann es einen Port wie 50000 bekommen. Aber wenn A ein UDP-Paket an C sendet, dann kann es ein anderes Mapping wie 50002 bekommen. Also in Ihrem Fall ein Paket an den Server senden Geben Sie einem Client einen Port, aber das Senden eines Pakets an einen anderen Client kann einen anderen Port ergeben.
Sie sollten hier mehr über NAT-Verhalten lesen:
Tags und Links java sockets udp hole-punching tunneling