Il existe deux sous-programmes Groovy ci-dessous qui envoient des messages les uns aux autres via des sockets UDP simples. Ils reçoivent les messages avec succès lorsqu'ils sont envoyés au 127.0.0.1
. Mais les messages ne sont pas reçus lors de leur envoi à l'adresse IP publique (la machine est derrière NAT).Pourquoi la perforation UDP ne fonctionne pas pour l'adresse IP publique?
Pourquoi le trou n'est pas perforé? Et comment réparer ça?
J'ai essayé d'interroger un serveur public STUN via une bibliothèque Java plus tôt, mais il a répondu avec la même adresse IP publique, donc j'utilise wtfismyip.com
ici.
class GroovyTest {
static String PUBLIC_IP = new URL('https://wtfismyip.com/text').text.trim()
//static String PUBLIC_IP = '127.0.0.1' // works fine
static void main(String[] args) {
runInstance(11111, 22222)
runInstance(22222, 11111)
}
static void runInstance(int thisPort, int anotherPort) {
def socket = new DatagramSocket(thisPort)
Thread.start {
// message listener
byte[] buf = new byte[1024]
while (true) {
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
InetAddress remoteAddr = packet.getAddress();
int remotePort = packet.getPort();
String sentence = new String(packet.getData(), 0, packet.length);
println("server-$thisPort: received [$sentence] from ${remoteAddr.hostAddress}:${remotePort}")
}
}
Thread.start {
// message sender
while (true) {
println("client-$thisPort: sending to ${PUBLIC_IP}:${anotherPort}...")
byte[] buf = ("Hello " + System.currentTimeMillis()).bytes
DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(PUBLIC_IP), anotherPort)
socket.send(packet)
Thread.sleep(2000)
}
}
}
}
'nouvelle URL ('https://wtfismyip.com/text') .text.trim()' - vraiment? –
@shmosel Oh Groovy –
https://stackoverflow.com/a/8524609/104458 – selbie