java udp打洞详解_网上大多数原理总结,UDP打洞原理

网络上的大多数UDP原理研究分析后,自己总结了下面的结果.

1、client A 登录 通过http服务器 webservices 验证成功获取自身信息与好友

列表信息等。

2、Http服务器登记client A的NAT后的IP地址与端口

3、Client B登录 通过http服务器 webservices 验证成功获取自身信息与好友列

表信息等。

4、Http服务器登记client B的NAT后的IP地址与端口

5、Client A想发送消息给Client B,向HTtp服务器获取Client B的在线IP地址

6、Client A获得Client B的IP地址后并发送UDP信息到Client B

7、Client A与Client B请求失败,信息丢失,此时Client A报告Http服务器要求

服务器帮忙对Client B进行通知

8、Http服务器接到此命令后,将Client A的IP地址发给Client B,要求他连接

9、Client B收到HTTP服务器的信息后发送请求到 Client A

10、由于此时Client A NAT已经存在Clinet B的session,所以此时 Client A与

Client B建立链接成功。

11、Client A发送消息到 Client B成功,不经HTTP服务器中转

总结:换句话说就是HTTP服务器启动了“和事老”的功能。为不信任的两个人发

出命令从而使他们达到了一种互相承认而此建立链接关系

其中最主要的是Server 的一个方法就是发送消息到被打洞的客户端

客户端发送消息需要判断该消息是否发送成功,不成功则要求请求打洞.若成功则不需要要求打洞!

客户端在接收到服务器的打洞指令后,则作出UDP发送响应

from:http://blog.csdn.net/wenzhoufeng/archive/2007/03/27/1542733.aspx

posted on 2007-08-21 01:37 杨粼波 阅读(6329) 评论(8)  编辑 收藏 引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDP打洞是一种P2P通信的技术,可以让两个在NAT后面的设备直接进行通信。下面是一个简单的Java UDP打洞的示例代码: ``` import java.net.*; public class UdpHolePunching { public static void main(String[] args) throws Exception { // 定义两个NAT后面的设备的IP和端口 InetAddress client1IP = InetAddress.getByName("192.168.1.100"); int client1Port = 5000; InetAddress client2IP = InetAddress.getByName("192.168.1.101"); int client2Port = 5000; // 创建两个UDP socket,分别绑定在两个设备的IP和端口上 DatagramSocket socket1 = new DatagramSocket(client1Port, client1IP); DatagramSocket socket2 = new DatagramSocket(client2Port, client2IP); // 客户端1向客户端2发送一条消息,用来获取NAT的映射关系 String message = "Hello, Client2"; DatagramPacket packet = new DatagramPacket(message.getBytes(), message.length(), client2IP, client2Port); socket1.send(packet); // 客户端2向客户端1发送一条消息,用来获取NAT的映射关系 message = "Hello, Client1"; packet = new DatagramPacket(message.getBytes(), message.length(), client1IP, client1Port); socket2.send(packet); // 等待一段时间,让NAT完成端口映射 Thread.sleep(1000); // 客户端1向客户端2发送一条消息,让两个设备之间建立P2P连接 message = "Let's start P2P communication!"; packet = new DatagramPacket(message.getBytes(), message.length(), client2IP, client2Port); socket1.send(packet); // 客户端2向客户端1发送一条消息,让两个设备之间建立P2P连接 message = "OK, let's do it!"; packet = new DatagramPacket(message.getBytes(), message.length(), client1IP, client1Port); socket2.send(packet); // 关闭socket socket1.close(); socket2.close(); } } ``` 这个示例代码中,我们创建了两个UDP socket,分别绑定在两个设备的IP和端口上。然后,客户端1向客户端2发送一条消息,客户端2向客户端1发送一条消息,用来获取NAT的映射关系。等待一段时间后,客户端1向客户端2发送一条消息,让两个设备之间建立P2P连接,客户端2向客户端1回复一条消息,表示同意建立P2P连接。最后,关闭socket。 需要注意的是,这个示例代码只是一个简单的UDP打洞的示例,实际应用中,UDP打洞还需要考虑到更多的因素,比如NAT类型、防火墙等等,需要更加复杂的技术实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值