如何解决Android UDP打孔
我正在尝试制作流式应用程序,但我想使用UDP。我希望该连接为P2P。所以我有一个运行在Google Cloud上的Java Tcp服务器,一个Android手机和我的PC。当android连接到tcp服务器时,它将在服务器上创建一个DatagramSocket,它将接收android发送的数据包以获取端口和ip。电脑也一样。每个客户端将获取对方的客户端ip和端口,每个客户端将获取服务器接收到的端口(例如:android从端口18000发送,它将获取其他客户端的ip和端口以及端口18000)。然后,我关闭初始的DatagramSocket并打开一个绑定到它从服务器获取的端口的新端口(例如18000)。但是,永远不会在pc和android之间建立连接(android在4G上,而pc在路由器上,所以网络不同)
socket = new DatagramSocket(Integer.parseInt(po));
这是我创建P2P数据报套接字的方式,其中po是18000(每个客户端具有不同的po-android有18000,而PC有45000),我可以从tcp服务器获得这些端口,并且可以。
public void send() throws NumberFormatException,IOException
{
//only for testing
byte[] buffer = new byte[1024];
buffer = "test".getBytes();
DatagramPacket packet = new DatagramPacket(buffer,buffer.length,InetAddress.getByName(ip),Integer.parseInt(port));
socket.send(packet);
}
这是我从P2P数据报发送数据的方式。 ip是对方的客户端公共ip,端口是对方正在监听的客户端端口。
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
byte[] buffer = new byte[64000];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
try {
socket.receive(packet);
//acum ca am primit
String ana = new String(packet.getData());
System.err.println("Am primit de la celalalt "+ana);
}
}
这里是侦听传入数据包的线程。 主要问题是,这仅在客户端与服务器位于同一网络上时才有效!即使我两个客户端都在同一netowk上,但是服务器在不同的服务器上,他们也不会收到任何东西。从TCP发送的数据是100%正确的。
DatagramPacket packet= new DatagramPacket(buffer,InetAddress.getByName("server_ip"),port_main);
socket_udp.send(packet);
这是我如何将UDP数据包发送到服务器以恢复端口的方式。
我尝试使用相同的socket_udp
,但没有再次创建socket
var,它也失败了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。