|      1morven      2016-04-29 17:27:29 +08:00 via iPhone 直接通讯的话公网 IP 或 dzm 是必要的吧 | 
|      2colatin      2016-04-29 17:28:32 +08:00 如果是严格的 NAT ,肯定无法直接通信。 | 
|  |      3dbfox OP 看到了这里我大致也理解了 双方都在局域网内就没有办法 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 和端口号发送消息 | 
|  |      4tinyproxy      2016-04-29 17:32:15 +08:00  1 1. DHT 协议收好 http://www.bittorrent.org/beps/bep_0005.html 2. P2P 启动的时候需要一个 Bootstrap 服务器,介绍你入党并告诉你几个其他党员的存在,然后你跟其他党员愉快的搅基的时候就可以不用管入党介绍人了。 3. 说错了请楼下轻拍, P2P 的东西只研究过 DHT 。 | 
|  |      6lbp0200      2016-04-29 19:25:02 +08:00 via Android 有个开源项目,狗洞 | 
|  |      7zhicheng      2016-04-29 19:34:31 +08:00 via Android 不是所有的 NAT 都能打洞。 | 
|  |      8laiyingdong      2016-04-29 19:40:42 +08:00 有一个应用实现 N2N VPN 与 QQ 等等 UDP 打洞是类似的  需要注意的是如果是 Symmetric (对称) NAT 穿透是很困难的 (网吧不可能 因为要玩游戏必须要 UDP 穿透) | 
|  |      9SlipStupig      2016-04-29 20:26:52 +08:00 用 stun 可以实现你想要的.... | 
|      10qile1      2016-04-29 20:38:15 +08:00 via Android 具体打洞不太清楚,我认为数据传输可能需要两个内网通过互通后可以实现 | 
|      11jimzhong      2016-04-29 20:54:09 +08:00 如果双方 NAT 设备靠谱,应该是可以实现的。 | 
|  |      12iwege      2016-04-29 22:02:07 +08:00 打洞的不知道 后面的可以考虑走 webrtc | 
|      13ahtsiu      2016-04-30 00:25:54 +08:00 stun , voip 的最佳拍档 | 
|  |      15jsq2627      2016-04-30 03:34:42 +08:00 via iPhone stun 打洞 turn 中转 ice 全自动协商 | 
|  |      16tinyproxy      2016-04-30 08:10:05 +08:00 via iPhone @msg7086 是,但楼主要的东西,模仿 dht 做一套是能搞定的,至于你说的 hash table ,既然自己做了,这个函数自己改改就好了,或者扩充一下协议也行。 | 
|      19haoc      2016-04-30 09:09:48 +08:00 需要例子的话,试一下 webrtc 呀~~ | 
|      20aru      2016-04-30 09:55:31 +08:00 | 
|  |      21sjqlwy      2016-04-30 10:38:21 +08:00 蒲公英路由器,哈哈😄 | 
|  |      22cchange      2016-04-30 11:26:50 +08:00 大家有什么比较好的内网互通软件吗? 我希望可以用 VNC 来代替 teamviewer 虽然 teamviewer 非常非常好用 | 
|      23hzqim      2016-04-30 12:11:57 +08:00 几年前, VeryCD 出过内网版电驴,不知道是否符合楼主所说 | 
|  |      24lefthand2006      2016-04-30 12:44:06 +08:00 n2n 可以实现楼主需求,变广域网电脑成虚拟内网,但现在的 supernode 都不稳定,可能需要自架一个 | 
|  |      25tinyproxy      2016-04-30 20:07:37 +08:00 via iPhone @msg7086 他要一个 P2P 的通信软件,我的建议是模仿 DHT 做一套,有啥问题?开始两个节点都不知道对方的存在,通过 bootstrap 服务器开始搜寻其他节点啊,能发现其他节点了,那该传输啥还不是你想怎么写怎么写,为啥纠结哈希表? | 
|      26SearchDream      2016-04-30 20:46:36 +08:00 via iPhone 你的理解是对的, verycd 的 emule 里有实现,你可以参考一下。 | 
|      27xiamx      2016-04-30 23:38:22 +08:00 | 
|  |      28tinyproxy      2016-05-01 01:09:24 +08:00 @xiamx 我怀疑你完全没看懂我的回复。我拿楼主的话贴着评论好了。 我想实现 A 在 S 的帮助下与 B 可以直接通讯, B 也可以直接通讯 A > 我的回复的里, bootstrap 服务器对应的就是 S, A,B 发送类似 DHT 的 find_nodes 给 S ,这样就可以获取到对方的网络地址了,剩下其他的通信模块,肯定得自己写,现有的 DHT 网络肯定是没有办法复用的。 > 至于你说的可以不通过 DHT 实现,我完全赞同,我只是说我自己的思路,参照 DHT 自己设计协议有什么问题?不过你要说增加复杂度,请问你的思路是什么样子的?不给参照就给我下结论不合适吧。 > 最后,别跟我扯 hashtable 了,我一开始说的就是自行设计协议,不然你我完全不在一个频道交流没有任何意义。 | 
|      29xiamx      2016-05-01 02:00:17 +08:00 真令人无语啊 QQ, skype, etc 在不使用分布式信息存储的情况下依然实现了使用 UDP 打洞的 P2P 通讯。 OP 问的是 UDP 打洞的实现,不是 DHT/Kadmelia/chord 这类东西... @tinyproxy | 
|  |      30msg7086      2016-05-01 02:22:46 +08:00 @tinyproxy 说真的,多花 1 分钟时间重新阅读一下 OP 的问题,很难吗? 如果真的很难,那我帮你总结一下 TL;DR 吧。 1. P2P 打洞有接触过的么 OP 的提问是关于 P2P 里打洞的技术,不是 P2P 里节点发现的技术。 2. QQ 是怎么实现的? QQ 之间互相传送文件时,两个节点是互相知道对方的。 QQ 上互相发送信息,腾讯服务器必然有维护通讯链接,返回对方的 IP 地址根本不需要查分布式表, QQ 用户也不需要维护分布式节点表。 OP 问的是两个 QQ 用户在传送文件时如何通过 NAT 打洞来完成直接发送而不是服务器中转流量。 3. A 连接上 S , B 连接上 S , S 通过什么手段 可以让 A 与 B 直接通讯呢? OP 最后的总结很明显的写了需求。 OP 从来没说过要做一个群 P 的通讯软件, OP 要做的是一个让两个不同内网的客户端能够互发数据的通讯软件。 4. 你我完全不在一个频道交流没有任何意义。 是的。回答问题首先要审题。 3 楼 dbfox 自己的回答其实已经是很标准的答案了。 如果你的回答是在一个问如何制作匿名 P2P 通讯软件的帖子里,那是很有用的回答, EM 的 KAD 和 BT 的 DHT ,现今著名的两大无服务器节点发现哈希网络。 但是回答的仍然不够准确,因为 DHT ·就·是·哈希表(而不是你所说的「别跟我扯 hashtable 」)。 BT 里的 DHT 是用来做 种子 Hash->[节点] 的列表映射的,也就是说 DHT 维护的并不是其他节点的列表,而是种子到节点的映射。你必须要有一个键,才能在 DHT 这个哈希表里找到这个键对应的节点列表。因此只能用在 多 P2P 的情况下,比如 BT 或者 EM 这样多人下载一个文件的场景下。两个人做 1P 2 1P 的单点传送, DHT 没有什么价值。 以及你一开始说的 Bootstrap 和 DHT 没什么关系。如果 A 和 B 互相不知道对方,只需要 Bootstrap 就行了,一丁点也不会用到 DHT 。 希望这篇阅读理解的分析能让你理解 OP 到底是在问什么。 | 
|  |      31msg7086      2016-05-01 02:26:40 +08:00 | 
|      34vip1024      2016-05-01 09:20:24 +08:00 tox ,你值得拥有, https://github.com/irungentoo/toxcore |