最近在弄语音通话,当在局域网测试程序的时候,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和端口发数据就对了。(就是在这里折腾了很久)
分享到:
相关推荐
可以做为tcp和udp的客户端和服务器端发送相关的tcp和udp包。可以发送十六进制和具体的数据
dotnet core UDP穿透内网客户端 非源码,但未加密 打洞实现 1、开一个云服务器,或自家的宽带,全主机映射。 2、云控制台上安全组udp打开相应的端口,打开防火墙上相应的端口。 3、两台客户端。。 4、A通过Udp...
这个我实在是不想收费,可是这个最低也要设置一分,无奈了。 资源关联博客:https://blog.csdn.net/qq_20698983/article/details/80296165 资源完整代码关联:...
此java类获取的是公网的IP地址,如想获取本机IP但不是公网IP查看我其他资源。
乐鑫Esp32学习esp32上实现本地 UDP 客户端和服务端角色,在局域网内实现通讯。博文:https://blog.csdn.net/xh870189248/article/details/80737111
2.使用方法:本软件既是服务器端又是客户端,使用时,先由内网的机器A(如果两个都由公网IP就无所谓了)向有公网IP的机器B发信息,B会显示对反的IP和端口,点击红色箭头,填入对方IP,就可以聊天了. 3.使用控件:TIdUDPServer...
用Java实现的UDP穿透NAT技术,内有详细的注释,完全可以自己看懂的
公网-网域网 ,UDP 通讯,可群发, 如果是放公网,将服务器放在公网,客户端可在局域网!
获取公网ip并发送邮件 https://blog.csdn.net/qq_37383852/article/details/119641446
在linux下的udp通信,采用c语言编写,可实现简单的文件下载与上传,适用于初学者
应某网友之邀,现将UDP打洞原理写成一个简单测试程序。为了简单起见,该程序服务器就接收两个...测试UDP打洞的时候最好是:服务器在一个公网IP上,两个客户端最好分布在两个不同网络,避免和服务器同在一个局域网。
qt写的tcp客户端
基于java实现的将局域网电脑的端口映射到公网。或不走公网流量使用直连客户端方式映射局域网电脑
阿里云公网redis集群搭建以及访问,本人亲测,可以成功搭建,java访问公网redis集群,
NULL 博文链接:https://kavy.iteye.com/blog/2241797
在私网内检测公网出口ip变化,并邮件通知私人邮件 使用技术: shell 脚本、linux系统知识 背景: 因为家里是nas服务器,使用的是联通网络,为了省钱没有申请固定外网ip,虽然是独立但是会周期性更改,导致每次从外...
Sakura Frp 公网版(DDNS 动态解析)客户端程序
当我遇到问题没法解决的时候,我深深的知道了贡献是多么重要。哈哈哈哈。大笑 客户端为sockect 服务端为mina 本地环境内网已测通。 测试环境为内网连接公网,公网连接公网可通。 如果测试不通 1.请检查端口服务...
通过异步任务来获取当前用户的ip地址,使用的时候调用getRemoteIP方法就可以,需要传一个可以获取公网ip的url地址,这个百多很多,比如,搜狐,淘宝之类的都有,同时还有一个超时的任务,具体看代码了
java-udp-qq聊天源码,p2p通信完全实现 UDP打洞实现了子网间的穿透功能,首先在一台拥有公网IP服务器上运行server,在不同的两个子网PC上运行client,输入服务器IP,即可进行打洞,实现不同子网的通信。