在我看来,较新的Android设备在NAT后运行,其中本地地址是内部运营商或LAN地址,公共地址是路由器或运营商分配的外部地址 .
然而,使用NetworkInterface时,较新的电话不会像访问IP检测服务时那样返回相同的地址 .
因此,通过直接P2P SocketChannel连接本身就会失败 .
针对Android平台设计此问题是否有任何常见的解决方法?任何人都可以澄清导致这种类似NAT的安全问题的原因吗?
任何指向Java NAT遍历 tutorials 或 examples ( NOT 论文或论文)的链接也将被视为有用(因为我不太确定如何在Java中实现它) .
我当然也会接受任何人提供的任何其他解决方案!
4 回答
几乎所有你将要触摸的手机或PC都不会因为这个设备而赢得了 . 运营商或ISP将路由器放在您的设备和公共互联网之间 . 根据您的应用程序,通常可以使用NAT遍历库,例如ice4j或STUNT .
我在自己的项目中这样做,发现这个问题并不复杂 .
这是node.js中一个非常简单的UDP echo服务器
Android客户端只需将msg发送到此节点服务器
Android客户端UDP列表器通过UDPholepunching获取常规消息和您自己的全局IP和端口
使用其他客户端IP的Android客户端UDP发送方
remoteHost
remotePort
看看http://sourceforge.net/projects/jnat-pmplib/这是java中NAT-PMP的一个实现 .
我已经设法通过转发您在路由器连接期间使用的套接字来 Build 套接字 . 它对我有用 .
UPDATE
如果您使用Windows(ipconfig)或通过终端会话(如果您使用Linux(ifconfig)),请通过cmd.exe查找您的IP地址 . 然后通过浏览器连接到它,应该有一个安全部分 . 在 Build ServerSocket和Socket时,转到端口转发并打开您使用的端口 . 使用TCP作为协议 . 请注意,这仅适用于您尝试从wlan外部进行连接的情况 .