Java 关于在公网上无法发送UDP数据给客户端问题

  最近在弄语音通话,当在局域网测试程序的时候,tcp和udp数据收发没有任何问题,客户端A传输udp数据给服务器,服务器再将数据通过udp转发给客户端B。但将服务器部署到云服务器上的时候就出现了问题。
  服务器可以收到客户端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和端口发数据就对了。(就是在这里折腾了很久)



 

猜你喜欢

转载自592713711.iteye.com/blog/2299160
今日推荐