dbfox
2016-04-29 17:31:41 +08:00
看到了这里我大致也理解了
双方都在局域网内就没有办法 TCP 直连了,所以像 QQ 等都会尽量使用 UDP 直连的
IP 地址转换不需要你处理,网关默认就已经进行了转换。
服务器接收到 DatagramPacket 中 getAddress 和 getPort 已经是网关的端口
UDP 打洞的过程大致如此:
1 、双方都通过 UDP 与服务器通讯后,网关默认就是做了一个外网 IP 和端口号 与你内网 IP 与端口号的映射,这个无需设置的,服务器也不需要知道客户的真正内网 IP
2 、用户 A 先通过服务器知道用户 B 的外网地址与端口
3 、用户 A 向用户 B 的外网地址与端口发送消息,
4 、在这一次发送中,用户 B 的网关会拒收这条消息,因为它的映射中并没有这条规则。
5 、但是用户 A 的网关就会增加了一条允许规则,允许接收从 B 发送过来的消息
6 、服务器要求用户 B 发送一个消息到用户 A 的外网 IP 与端口号
7 、用户 B 发送一条消息,这时用户 A 就可以接收到 B 的消息,而且网关 B 也增加了允许规则
8 、之后,由于网关 A 与网关 B 都增加了允许规则,所以 A 与 B 都可以向对方的外网 IP 和端口号发送消息