以下に2つのGroovyサブプログラムがあり、以下にプレーンUDPソケットを介してメッセージを送信します。彼らは127.0.0.1
に送信されたときにメッセージを正常に受信します。しかし、パブリックIPアドレスに送信するときにはメッセージは受信されません(マシンはNATの背後にあります)。パブリックIPアドレスでUDPホールパンチが機能しないのはなぜですか?
なぜ穴が穿孔されないのですか?それを修正する方法は?
私は以前にJavaライブラリを介して公開STUNサーバーに問い合わせを試みましたが、同じ公開IPアドレスで応答していましたので、ここでwtfismyip.com
を使用しています。
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)
}
}
}
}
'新しいURL( 'https://wtfismyip.com/text').text.trim()' - 本当ですか? –
@shmosel Oh Groovy –
https://stackoverflow.com/a/8524609/104458 – selbie