Disons que j'ai deux ordinateurs.
Ils connaissent les uns des autres publics et des IP privés via ice4j
.
Un client écoute et l'autre envoi de la chaîne.
J'aimerais voir cela se produire via UP Hole Punching:
Let A be the client requesting the connection
Let B be the client that is responding to the request
Let S be the ice4j STUN server that they contact to initiate the connection
--
A sends a connection request to S
S responds with B's IP and port info, and sends A's IP and port info to B
A sends a UDP packet to B, which B's router firewall drops but it still
punches a hole in A's own firewall where B can connect
B sends a UDP packet to A, that both punches a hole in their own firewall,
and reaches A through the hole that they punched in their own firewall
A and B can now communicate through their established connection without
the help of S
Ce serait bien si vous avez compté le double NAT aussi.
Vous pouvez utiliser Stum pour découvrir l'IP et le port, mais vous devez écrire votre propre code qui enverrait l'IP: port de votre serveur via keepalive
technique.
Une fois qu'un client identifie l'autre via un ID unique sur le serveur, il sera fourni avec l'IP du client de l'autre: Info du port sur le trou de l'UDP Punch les données nécessaires à l'envoi et à la réception.
Il y a une bibliothèque qui s'affiche à l'horizon pour Java Vérifiez-le:
[.____] https://github.com/htwg/uce#readme
Votre question est vraiment large - je ne peux pas offrir un exemple, mais les liens suivants pourraient aider (spécifications, bibliothèques, échantillons, etc.):
http://jstun.javawi.de/ et http://www.t-king.de/blog/index.php?category=jstun (BTW: JSTUN n'est plus maintenu de ce que je rassemble)
http://www.codeproject.com/articles/23481/stunner-a-stun-library-and-Client (est en C++ mais pourrait illustrer comment le faire fonctionner)
Votre problème n'est pas un Java associé. Si vous savez comment ouvrir une connexion UDP, c'est suffisant. Lisez le contenu du suivant link . Ne soyez pas Effrayé par le titre, il couvre également UDP. Le reste est juste Java codage.
P.s. : Dans votre scénario, il y a une étape manquante. A et B doivent avoir une connexion ouverte à S, car s doit dire à B qu'a tente de l'atteindre. Si B n'a pas de connexion ouverte à S, il n'ya aucun moyen A et B peut commencer à communiquer ensemble.
[~ # ~ ~] Mise à jour [~ # ~]
La réponse faite par Jason contient des erreurs et une spéculation sauvage sur NAT Traverse. Il faut lire le travail effectué par Saikat Guha (meci-s.org/~francis/imc05-tcpnat. PDF) Pour bien comprendre cette affaire. La classification du cône de Wikipedia est complètement obsolète et trompeuse.
Stum fonctionne essentiellement comme suit: Votre client derrière le pare-feu se connecte à un serveur étonnant en dehors du pare-feu. Le serveur étonnant inspecte le paquet reçu du client et envoie le client une réponse à la réaction contenant les clients IP et le port lorsqu'ils apparaissent au serveur Stum.
C'est ainsi que le client derrière le pare-feu découvre sa propre adresse IP et port externe. Pour autant que je sache un serveur étonnant ne transmettra normalement pas d'informations d'adresse d'un client à un autre.
Typiquement étourdissements est utilisé pour configurer des flux de support via des pare-feu, lorsque le pare-feu est déjà ouvert au trafic de signalisation - par exemple. En VoIP: Le client contacte un serveur étonnant pour découvrir sa propre adresse IP et port externe pour le trafic UDP, il envoie ensuite sa demande de signalisation (invité SIP ou autre) à l'autre client sur un port ouvert bien connu - y compris ses informations d'adresse UDP externe. dans la charge utile (SDP ou autre). Donc, généralement un client doit être accessible sur un port ouvert pour signaler la communication entre pairs.