iPhone - 如何在 P2P 中传输数据
-
23-08-2019 - |
题
我正在尝试实现一个P2P应用程序。我尝试做的是在设备之间传输自定义 NSObject 类的数据。我无法弄清楚 GKSession 何时调用“receivedData”方法。
这是我所做的
通常的连接并显示与同行的对话框
当应用程序收到对等点的状态更改且状态为“已连接”时,我将使用 NSCoding 方法将数据发送到所有对等点(理想情况下,应在每个对等点接受连接时调用此方法)
在 receiveData 中,我正在解码 NSData 并取回 NSObject 实例
问题是 会话:对等点:didChangeState: 两个设备上都没有调用方法。它只是在点击 PeerPicker 警报中的“连接”按钮的设备上被调用。
问题
didChangeState 何时被调用以及为谁调用?当每个对等点连接时,不应该调用它吗?
什么时候收到数据:方法调用以及为谁调用?调用它是为了确认收到消息(握手)还是只是为了传输其他对等方发送的数据?
谢谢你的帮助。
解决方案
更多地将其视为“主/奴隶”,而不是“同伴到同伴”。大概双方都与Gamekit建立了,并分配了他们的代表。发起连接的一侧通过 GKPeerStateConnected
接收者已接受邀请并且已建立连接以便可以开始发送内容的状态更改值。
然而,接收方首先收到有人想通过 didReceiveConnectionRequestFromPeer
委托方法。它保存会话以供以后使用,然后转身调用 acceptConnectionFromPeer
接受它。从那时起,它就会收到通过 receiveData
方法。
做到这一点的最好方法是有一个小状态机来管理每一方所处的状态。发件人仅在收到信息后才发送 GKPeerStateConnected
事件。接收器被放入 connected
一旦它接受连接请求,它就可以进行任何在开始获取数据之前需要做的设置。
由于网络抽象是 GKSession
然后接收者可以转身并使用它进入的相同会话实例 didReceiveConnectionRequestFromPeer
并用它写回发送者(发送者应该有自己的 receiveData
使用接收者的响应调用的方法)。
需要记住的一件事是,您可以通过 GameKit 发送的缓冲区存在隐式数据大小限制。您可能想要尝试找出适合您系统的值(我得到的值在 5K 到 10K 之间——由于某种原因它有所不同)。您可能希望使用代码将 NSData 分成块并管理数据的打包/解包。