服务器可以收到客户端A发来的udp数据,但客户端B收不到服务器转发的消息。
在网上找了些资料得出结论,公私网之间UDP传输根本不需要什么端口映射,也不需要配置路由器什么的。
客户端可以通过外网服务器的ip地址和端口号,向服务器发送数据,而客户端在内网,服务器必须要知道客户端的在外网ip和端口号才能向客户端发送udp数据。所以客户端必须先发送udp数据到服务器,这样服务器才能知道其地址和端口号,这就是所谓的“打洞”。
我就让客户端B开始的时候随便发条数据到服务端,然后通过得到的UDP数据包得到客户端B的外网ip和端口号
InetAddress clientBAddress=packet.getAddress(); int clientBPort = packet.getPort();
然后发送数据给客户端B的时候将 发送到上面得到的ip地址和端口
DatagramPacket sendPkt = new DatagramPacket(data,data.length, clientBAddress,clientBPort ); // 转发给客户端B socket.send(sendPkt);
注意:
关键就是这里的端口,并不是私网绑定时的端口号,而是经过一系列路由后的端口号,只要公网给这个IP和端口发数据,又反向经过一系列路由到达私网客户端,在整个过程中,不必关心中间过程的IP和端口号变化,总之一句话:公网收到哪个IP和端口的数据,就给该IP和端口发数据就对了。(就是在这里折腾了很久)