`
VIP庚
  • 浏览: 220854 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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和端口发数据就对了。(就是在这里折腾了很久)



 
2
3
分享到:
评论
4 楼 VIP庚 2017-01-15  
donnykeon 写道
博主您好 我也是最近在弄UDP的视频语音通话 项目中也需要文字 图片 视频的传输 我已经做好了 但是在视频通话这里 我实在理不清这个思路 我的项目需要在局域网内完成 不用连接外网 请您赐教


既然完成了视频传输,那音频传输也不难了,现在就要实现音视频的同步 你可以参考一下这篇文章
http://www.cnblogs.com/x_wukong/p/5876645.html
3 楼 donnykeon 2017-01-11  
博主您好 我也是最近在弄UDP的视频语音通话 项目中也需要文字 图片 视频的传输 我已经做好了 但是在视频通话这里 我实在理不清这个思路 我的项目需要在局域网内完成 不用连接外网 请您赐教
2 楼 VIP庚 2016-05-20  
xingmu 写道
UDP需要自己维护通讯链路,也就是所有UDP的客户端最好实现一个心跳线程主动与服务器端通讯,间隔不要超过45秒,这样服务器端就能下发数据到各客户端。

学到了 <( ̄3 ̄)>
1 楼 xingmu 2016-05-20  
UDP需要自己维护通讯链路,也就是所有UDP的客户端最好实现一个心跳线程主动与服务器端通讯,间隔不要超过45秒,这样服务器端就能下发数据到各客户端。

相关推荐

Global site tag (gtag.js) - Google Analytics