【发布时间】:2019-05-25 21:14:21
【问题描述】:
我是 WebRTC Android 的新手,通过使用 jStun 和下面的代码,我可以获得我的 android 设备的公共 IP 和端口。
new Thread() {
@Override
public void run() {
super.run();
try {
MessageHeader sendMH = new MessageHeader(MessageHeader.MessageHeaderType.BindingRequest);
ChangeRequest changeRequest = new ChangeRequest();
sendMH.addMessageAttribute(changeRequest);
byte[] data = sendMH.getBytes();
s = new DatagramSocket(4500);
s.setReuseAddress(true);
DatagramPacket p = new DatagramPacket(data, data.length, InetAddress.getByName("stun.l.google.com"), 19302);
s.send(p);
DatagramPacket rp;
rp = new DatagramPacket(new byte[32], 32);
//Recieve Packet from Stun Server
s.receive(rp);
MessageHeader receiveMH = new MessageHeader(MessageHeader.MessageHeaderType.BindingResponse);
receiveMH.parseAttributes(rp.getData());
final MappedAddress ma = (MappedAddress) receiveMH
.getMessageAttribute(MessageAttribute.MessageAttributeType.MappedAddress);
//Show Public IP and Port On Text View
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView myIp = findViewById(R.id.listeningIp);
TextView myPort = findViewById(R.id.listeningPort);
myIp.setText(ma.getAddress().toString());
myPort.setText(ma.getPort() + "");
}
});
while (true) {
byte[] b = new byte[1024];
DatagramPacket rr = new DatagramPacket(b, 0, b.length);
//This Recieve Aimed to Recieve from Laptop Packet Sender
s.receive(rr);
final String sss = new String(rr.getData());
Log.e("recieved", sss);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
Android 设备的公共 IP 和端口:39.41.148.77:4500
但是当我从笔记本电脑数据包发送软件向 Android(39.41.148.77:4400) 发送数据包时,它没有收到。
感谢任何指南。谢谢
【问题讨论】:
-
你怎么知道它没有被 B 收到? B 用来回答的代码是什么?您确定 A 发送了数据包并且 B 收到了它(例如通过 Wireshark)吗?由于它是 UDP,它可能会在您不知情的情况下丢失。
-
@SamiTahri 是的,我确定它以相同的 IP 和端口将数据包发送到 B。因为我什至尝试使用第三方软件将数据包递归发送到 Ip:Port 但在任何设备 A、B 上都没有收到
-
可能是我错了在我告诉你他场景的方法中。当我获得两个设备的公共 IP 和端口时。我只是尝试使用第三方工具向两台设备发送数据包,但在任何设备上都没有收到。
-
当我知道两个设备的 ip 和端口时。我试图从笔记本电脑发送带有packetsender.com 的数据包。一个接一个,但没有收到任何一个。设备 A 和 B 是 Android 设备
-
“收到”是什么意思?