如何通过公共IP发送数据?

时间:2020-05-11 12:38:41

标签: java android tcp rtp hole-punching

我目前正在使用 Android应用,该应用需要将数据从一台设备传输到另一台设备。我想在没有任何服务器的情况下实现数据传输。我可以自己进行握手以交换动态IP(会话发起),但是现在我已经苦苦挣扎了数周,如何在知道它们的公共IP和私有IP的情况下如何将数据发送到另一台设备。

目前,我的应用只能通过 TCP套接字将数据发送到同一WiFi内的设备(因此只能使用私有IP)。但是一旦我尝试发送到公共IP,它们就会迷路。他们可能无法通过路由器的防火墙。手动关闭防火墙是没有选择的。所以我想TCP是错误的协议。我想到了类似“ IP语音” 的功能,但是可以发送任何二进制数据,而不仅仅是发送视频和音频。

我的想法是:

  1. 类似 Magic-Wormhole 的原因,因为它在PC上像超级魅力一样,但是很遗憾,我找不到在Android上使用它的任何方式

  2. RTP (用于IP语音的协议)

  3. “ UDP 打孔”以处理NAT。

其中一种可能是解决方案。问题是我不知道如何在 Java / Android

中实现此类操作

(我的Project在GitHub上)

2 个答案:

答案 0 :(得分:1)

当前Internet确实很复杂,基本上您无法通过将数据发送到其公用IP来访问另一台设备,因为大多数PC或移动设备都位于NAT之后。

在这种情况下,您需要的是STUN服务器,该服务器可以帮助两个设备在复杂的网络中相互通信。您可以使用像STUNTMAN这样的开源实现来创建自己的STUN服务器,但是它确实很复杂,因此我的建议是尝试使用商业STUN服务。

答案 1 :(得分:1)

您可以检出Google STUN服务器以将RTP / UDP数据包传输到网络。

STUN servers: A Quick Start Guide

                        Port     URI
STUN Server (Main LB)   19302    stun.l.google.com

STUN Server             19302    stun1.l.google.com

STUN Server             19302    stun2.l.google.com

STUN Server             19302    stun3.l.google.com

STUN Server             19302    stun4.l.google.com