`
VIP庚
  • 浏览: 223899 次
  • 性别: 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秒,这样服务器端就能下发数据到各客户端。

相关推荐

    Java实现UDP穿透NAT技术

    5. **Client.java**:同样,这个文件可能代表了UDP客户端的实现,负责初始化STUN请求,接收响应,并尝试与其他客户端建立直接连接。它可能包含了一个`Client`类,该类实现了UDP套接字的创建、数据发送和接收。 6. *...

    java udp p2p nat 等打洞技术实现通信,已测试成功

    在Java中,我们可以使用`java.net.DatagramSocket`类来创建UDP套接字,`java.net.DatagramPacket`来封装数据,并使用`send()`和`receive()`方法进行数据的发送和接收。服务器端需要监听并转发客户端的请求,而客户端...

    java简单UDP聊天程序

    UDP是TCP/IP协议族中的一个无连接、不可靠的传输协议,它在发送数据时不需要建立连接,也不保证数据包的顺序到达和完整性。由于其轻量级的特性,UDP常用于对实时性要求较高的应用场景,如在线游戏、视频通话和流媒体...

    udp 打洞示例代码 包含服务器 客户端

    4. **打洞原理**:客户端A向客户端B的公网IP和端口发送UDP数据包,即使B还没有向A发送过任何数据。如果B的NAT是Full Cone或Restricted Cone类型,它会允许这个来自A的未知源的数据包通过,并映射到B的内网IP和端口。...

    udp打洞 客户端和服务端 附说明文档

    在内网中,由于NAT(Network Address Translation)的存在,内网设备无法直接被外网访问,UDP打洞就是解决这个问题的一种技术。 首先,我们要理解NAT的工作原理。NAT用于将内部网络的私有IP地址转换为对外的公共IP...

    NAT穿越(UDP)

    - **TURN服务器**:当STUN方法无法建立直接连接时,TURN服务器作为一个中继,接收来自客户端的数据,然后转发给另一个客户端。这种方式虽然效率较低,但能应对更复杂的NAT配置。 3. **UDP打洞**:这是NAT穿越的...

    Linux下UDP通信

    在Linux操作系统中,UDP(User Datagram Protocol)是一种无连接的传输层协议,常用于需要快速传输数据且对数据完整性要求不高的场景。本教程将深入探讨如何使用C语言在Linux环境下进行UDP通信,并通过实现简单的...

    Net Java UDP穿透技术之路2.zip

    在局域网环境中,UDP通信通常可以直接进行,但当网络环境存在NAT(网络地址转换)时,由于内网IP无法直接与公网IP通信,UDP穿透技术就显得尤为重要。 标题“Net Java UDP穿透技术之路2.zip”暗示了这是一个关于使用...

    基于Java开发的一款基于Netty的内网穿透工具,主要用于将内网服务反向代理到公网访问.zip

    当内网设备需要被公网访问时,客户端会与服务器建立连接,服务器作为中介转发公网的请求到内网客户端,并将客户端的响应回传给公网。这种设计克服了NAT(网络地址转换)对直接公网访问内网的限制。 在实际应用中,...

    Netty UDP协议网络打洞实例

    在UDP打洞中,设备A向STUN/TURN服务器发送请求,服务器会返回A的公网IP和端口信息,然后设备B可以通过这个信息向A发送数据。 在Netty中,实现UDP打洞的关键步骤如下: 1. **创建Netty Channel**: 首先,我们需要...

    Java的UDP的开发案例代码

    Java UDP 穿透 NAT 的实现是一个常见的技术挑战,特别是在P2P(点对点)通信中。NAT(网络地址转换)会隐藏内部网络的IP地址,使得直接的通信变得困难。UDP(用户数据报协议)由于其无连接、低延迟的特性,常被用于...

    STUN客户端服务器源代码,仅供参考

    它发送请求到STUN服务器,然后服务器返回响应,包含客户端在NAT后面所映射的公网属性。这个过程称为“绑定请求”。 开源的STUN服务器源代码对于开发者来说是一个宝贵的学习资源,可以理解STUN协议的工作原理,以及...

    android UDP

    在Android设备上,我们可以使用`java.net.DatagramSocket`类来创建一个UDP套接字,这个套接字可以用于发送和接收数据报。数据报是UDP协议中的基本数据单元,它包含了要传输的数据以及源和目标的IP地址和端口号。 1....

    P2p之UDP穿透NAT的原理与实现代码

    在P2P通信中,UDP常被用于实时通信,如音频和视频流,因为它可以快速地发送数据,而无需建立和维护连接。 **P2P之UDP穿透NAT的原理**: 1. **UDP打洞**:由于NAT的存在,直接的P2P通信通常无法进行。UDP打洞技术...

    NAT探测 使用stun协议 java和python版本

    它的工作原理是,客户端向STUN服务器发送请求,服务器接收到请求后,将包含请求来源IP和端口的信息返回给客户端。通过这种方式,客户端可以得知自己在NAT后面的映射情况,从而判断NAT类型,例如是锥形NAT、对称NAT...

    NAT穿透java

    5. **Java中的UDP编程**:在Java中,我们可以使用`java.net.DatagramSocket`类来创建UDP套接字,`DatagramPacket`类用于封装数据并发送或接收数据。通过这两个类,可以构建UDP服务器和客户端,实现数据的发送和接收...

    java 用udp,tcp协议实现的局域网聊天程序 期末大作业 可私聊,群聊

    Java编程语言在实现网络通信时,常常会使用到两种主要的传输协议:UDP(User Datagram Protocol)和TCP(Transmission Control Protocol)。本项目是基于这两种协议实现的局域网聊天程序,具备私聊和群聊功能,尽管...

    java编的P2P程序+源码.rar

    【标题】"java编的P2P程序+源码.rar" 涉及的主要知识点是Java编程语言在实现P2P(对等网络)程序上的应用,以及如何通过UDP打洞技术穿越NAT(网络地址转换)进行通信。P2P网络是一种分布式网络架构,其中每个节点...

    JAVA穿越NAT

    在实现这些技术时,我们需要创建UDP套接字来处理数据传输,并且要考虑到网络延迟、丢包和重传等问题。Java的`java.net.DatagramSocket`类提供了创建和管理UDP套接字的功能。在处理P2P通信时,我们需要维护一个会话...

    P2P之UDP穿透NAT P2PClient

    通过让两个设备都向对方的公共IP和端口发送UDP数据包,即使它们没有先接收到任何数据,NAT也可能会为它们打开“洞”,从而实现通信。 2. **ICE(Interactive Connectivity Establishment)**:ICE是一种更全面的...

Global site tag (gtag.js) - Google Analytics