2012-07-09 58 views
3

我已经阅读了大量关于网络的问题,似乎无法找到一个可靠的答案。如果我有一台运行在蜂窝数据上的iPhone和另一台iOS设备(位于两个不同的位置),是否可以直接向对方发送数据,而无需先发送到网络服务器,然后进行检索?是从服务器/ Apple的iCloud发送和接收的唯一选项吗?如果我知道设备的IP地址怎么办?请注意,iPhone禁用了WiFi。可能在两台iOS设备之间发送数据?

我不想把它放在应用程序商店,它是供个人使用。我知道NSNotificationCenter不是一个选项。

+0

只要使用苹果的iCloud,连接到3G/4G连接的手机不会以典型的方式获得其IP地址。任何解决方案都会涉及黑客攻击,不会无缝衔接,并且性能可怕。 – 2012-07-09 16:00:33

+0

使用CoreBluetooth? – nacho4d 2012-07-09 16:02:26

+0

只有几种方法可以直接从一台设备向另一台设备发送数据 - 3G和wifi是常用的方法。您需要两台设备都使用相同的数据服务 - 如果无法访问WiFi网络,知道IP地址并不重要。 ECEsurfer的方法可能是最好的,这取决于你需要的确切用途。 – Dustin 2012-07-09 16:05:27

回答

6

使用的GameKit框架,你可以发送两个iOS设备之间的数据一个不错的选择。这很容易实现。除此之外,我不认为有两种iOS设备之间发送数据的方式。

+0

是的,我刚刚发现了这一点,并且即将添加它作为我的答案,但你击败了我! ; ) – Imirak 2012-07-09 21:19:10

+0

让我知道你需要更多的帮助gamekit .. :) – 2012-07-10 04:07:08

+0

它似乎不可能发送数据从一个设备到另一个,当他们不在同一网络/在一定范围内使用GameKit。真的吗?在两个完全不同的位置的设备之间发送数据怎么样? – Imirak 2012-07-10 16:30:43

0

我认为Bluetooth将是你

+3

我认为可以肯定的是,当提问者告诉我们这两个设备位于不同的网络上时,它们已经超出了蓝牙范围。 – 2012-07-09 16:04:20

+0

是@Jacob Oscarson是对的。我无法使用蓝牙。 – Imirak 2012-07-09 16:05:34

+0

@JacobOscarson如果OP这么说,那么它一定是;但在未来降价的情况下(如我刚刚收到)。仅仅因为两部手机使用2个不同的运营商并不意味着他们超出了蓝牙范围。而FYI GameKit(这是正确的答案)也使用蓝牙。 – onetwopunch 2014-02-04 00:40:07

1

如果IP地址是可通过Internet访问的公共IP地址,则只能使用直接IP地址通信,并且它们是静态的(足够),以便它们不会定期更改,因为设备会动态分配给地址。在许多(大多数)情况下,这不会是真的,因为您的设备将被动态分配其IP地址,并且这些地址通常会是自行分配的IP地址,这些IP地址不可公开寻址。

正如其他人所评论的,使用苹果提供的机制如iCloud可能是最简单的选择。如果这不是您想要的,那么可能有一些方法可以使用像DynDNS这样的动态DNS服务来管理设备的实际IP地址。使用类似的东西,您可能可以使用基于指定DNS查找的设备之间的直接IP连接。你可能不得不跳过一些箍环来实现这一点,但我不确定你想要达到那个程度。

+0

嗯。好吧,我要和苹果提供的GameKit一起去。这是有据可查的,并且看起来很容易实现。谢谢(你的)信息! – Imirak 2012-07-09 21:29:46

3

实际上,这是可能的。你可能想要google的东西叫做“UDP hole punching”或“TCP hole punching”。

简而言之:假设你有类似于中继服务器的东西,那就是互联网中的某个服务器,可以从连接到www的每个专用局域网公共寻址。不,您有两个客户端A和B位于(不同的)专用LAN中,并且正在进行一些网络地址转换(NAT),这些客户端希望建立对等连接。

首先两者都会告诉服务器他们的IP地址和他们在他们自己的局域网中的端口。在UDP或TCP数据包中,服务器将查找设备(或NAT(路由器))的公共地址和端口。所以服务器知道私有和公共IP地址以及端口。

如果现在A想与B通信,它会要求服务器寻求帮助。服务器会向B发送一条消息,表明A想要告诉她A的公共和私人IP和端口。 A取回B的公共和私人信息和端口。

现在,这里是魔术发生的地方。两个客户端现在都会发送数据包,以便同时建立与另一方的私有和公共地址的连接,从而在NAT中打出一个整体,从而不会阻止传入连接。即使一个用户的连接建立数据包在整个创建之前到达,另一个用户的数据包也会通过连接建立连接。

小心一些NAT扫描IP地址的数据并翻译它们,但是如果你加密你的数据或者改变地址的外观(补充,......)你会没事的。

现在的主要问题是,服务器如何在没有活动连接的情况下与其中一个客户端进行通信。那么在这种情况下,你可以使用“连接反转”和苹果的“推送通知”。使用“推送通知”(pn)告诉NAT后面的客户端存在感兴趣的事情,并且应该联系服务器。一旦完成,连接处于活动状态,并可按前述方式使用。

我希望这可以帮助一些人解决这个问题,尽管这个帖子已经很老了!

相关问题