最近在弄语音通话,当在局域网测试程序的时候,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和端口发数据就对了。(就是在这里折腾了很久)
分享到:
相关推荐
5. **Client.java**:同样,这个文件可能代表了UDP客户端的实现,负责初始化STUN请求,接收响应,并尝试与其他客户端建立直接连接。它可能包含了一个`Client`类,该类实现了UDP套接字的创建、数据发送和接收。 6. *...
在Java中,我们可以使用`java.net.DatagramSocket`类来创建UDP套接字,`java.net.DatagramPacket`来封装数据,并使用`send()`和`receive()`方法进行数据的发送和接收。服务器端需要监听并转发客户端的请求,而客户端...
UDP是TCP/IP协议族中的一个无连接、不可靠的传输协议,它在发送数据时不需要建立连接,也不保证数据包的顺序到达和完整性。由于其轻量级的特性,UDP常用于对实时性要求较高的应用场景,如在线游戏、视频通话和流媒体...
4. **打洞原理**:客户端A向客户端B的公网IP和端口发送UDP数据包,即使B还没有向A发送过任何数据。如果B的NAT是Full Cone或Restricted Cone类型,它会允许这个来自A的未知源的数据包通过,并映射到B的内网IP和端口。...
在内网中,由于NAT(Network Address Translation)的存在,内网设备无法直接被外网访问,UDP打洞就是解决这个问题的一种技术。 首先,我们要理解NAT的工作原理。NAT用于将内部网络的私有IP地址转换为对外的公共IP...
- **TURN服务器**:当STUN方法无法建立直接连接时,TURN服务器作为一个中继,接收来自客户端的数据,然后转发给另一个客户端。这种方式虽然效率较低,但能应对更复杂的NAT配置。 3. **UDP打洞**:这是NAT穿越的...
在Linux操作系统中,UDP(User Datagram Protocol)是一种无连接的传输层协议,常用于需要快速传输数据且对数据完整性要求不高的场景。本教程将深入探讨如何使用C语言在Linux环境下进行UDP通信,并通过实现简单的...
在局域网环境中,UDP通信通常可以直接进行,但当网络环境存在NAT(网络地址转换)时,由于内网IP无法直接与公网IP通信,UDP穿透技术就显得尤为重要。 标题“Net Java UDP穿透技术之路2.zip”暗示了这是一个关于使用...
当内网设备需要被公网访问时,客户端会与服务器建立连接,服务器作为中介转发公网的请求到内网客户端,并将客户端的响应回传给公网。这种设计克服了NAT(网络地址转换)对直接公网访问内网的限制。 在实际应用中,...
在UDP打洞中,设备A向STUN/TURN服务器发送请求,服务器会返回A的公网IP和端口信息,然后设备B可以通过这个信息向A发送数据。 在Netty中,实现UDP打洞的关键步骤如下: 1. **创建Netty Channel**: 首先,我们需要...
Java UDP 穿透 NAT 的实现是一个常见的技术挑战,特别是在P2P(点对点)通信中。NAT(网络地址转换)会隐藏内部网络的IP地址,使得直接的通信变得困难。UDP(用户数据报协议)由于其无连接、低延迟的特性,常被用于...
它发送请求到STUN服务器,然后服务器返回响应,包含客户端在NAT后面所映射的公网属性。这个过程称为“绑定请求”。 开源的STUN服务器源代码对于开发者来说是一个宝贵的学习资源,可以理解STUN协议的工作原理,以及...
在Android设备上,我们可以使用`java.net.DatagramSocket`类来创建一个UDP套接字,这个套接字可以用于发送和接收数据报。数据报是UDP协议中的基本数据单元,它包含了要传输的数据以及源和目标的IP地址和端口号。 1....
在P2P通信中,UDP常被用于实时通信,如音频和视频流,因为它可以快速地发送数据,而无需建立和维护连接。 **P2P之UDP穿透NAT的原理**: 1. **UDP打洞**:由于NAT的存在,直接的P2P通信通常无法进行。UDP打洞技术...
它的工作原理是,客户端向STUN服务器发送请求,服务器接收到请求后,将包含请求来源IP和端口的信息返回给客户端。通过这种方式,客户端可以得知自己在NAT后面的映射情况,从而判断NAT类型,例如是锥形NAT、对称NAT...
5. **Java中的UDP编程**:在Java中,我们可以使用`java.net.DatagramSocket`类来创建UDP套接字,`DatagramPacket`类用于封装数据并发送或接收数据。通过这两个类,可以构建UDP服务器和客户端,实现数据的发送和接收...
Java编程语言在实现网络通信时,常常会使用到两种主要的传输协议:UDP(User Datagram Protocol)和TCP(Transmission Control Protocol)。本项目是基于这两种协议实现的局域网聊天程序,具备私聊和群聊功能,尽管...
【标题】"java编的P2P程序+源码.rar" 涉及的主要知识点是Java编程语言在实现P2P(对等网络)程序上的应用,以及如何通过UDP打洞技术穿越NAT(网络地址转换)进行通信。P2P网络是一种分布式网络架构,其中每个节点...
在实现这些技术时,我们需要创建UDP套接字来处理数据传输,并且要考虑到网络延迟、丢包和重传等问题。Java的`java.net.DatagramSocket`类提供了创建和管理UDP套接字的功能。在处理P2P通信时,我们需要维护一个会话...
通过让两个设备都向对方的公共IP和端口发送UDP数据包,即使它们没有先接收到任何数据,NAT也可能会为它们打开“洞”,从而实现通信。 2. **ICE(Interactive Connectivity Establishment)**:ICE是一种更全面的...