【问题标题】:iPhone - how is data transferred in P2PiPhone - 如何在 P2P 中传输数据
【发布时间】:2009-07-05 20:45:58
【问题描述】:

我正在尝试实现一个 P2P 应用程序。我尝试做的是在设备之间传输自定义 NSObject 类的数据。我无法弄清楚 GKSession 何时调用“receivedData”方法。

这就是我所做的

  1. 通常的连接并显示与对等点的对话框

  2. 当应用接收到对等点的状态更改并且状态为已连接时,我将使用 NSCoding 方法将数据发送到所有对等点(理想情况下,这应该在每个对等点接受连接时调用)

  3. 在 receivedData 中,我正在解码 NSData 并取回 NSObject 实例

问题是 session:peer:didChangeState: 方法在两个设备上都没有被调用。它只是在点击 PeerPicker 警报中的“连接”按钮的设备上被调用。

问题

  1. 何时调用 didChangeState 以及为谁调用?不是应该在每个对等点连接时都调用它吗?

  2. 何时调用 receivedData: 方法以及为谁调用?调用它是为了确认收到消息(握手)还是只是为了传输其他对等方发送的数据?

感谢您的帮助。

【问题讨论】:

    标签: iphone iphone-sdk-3.0 p2p


    【解决方案1】:

    更多地将其视为“主/从”而不是“点对点”。大概双方都已经安装了 GameKit 并分配了他们的代表。发起连接的一方通过GKPeerStateConnected 状态更改值通知接收方已接受邀请并建立连接,因此它可以开始发送内容。

    但是,接收方首先收到通知,有人想通过didReceiveConnectionRequestFromPeer 委托方法与其交谈。它保存会话供以后使用,然后转身并调用acceptConnectionFromPeer 接受它。从那时起,它会获取通过receiveData 方法发送过来的任何内容。

    最好的方法是有一个小的状态机来管理每一方的状态。发送者只在收到GKPeerStateConnected 事件时发送。一旦接收器接受连接请求,它就会进入connected 状态,因此它可以在开始获取数据之前进行所需的任何设置。

    由于网络抽象是GKSession,因此接收者可以转身并使用它在didReceiveConnectionRequestFromPeer 中获得的相同会话实例,并使用它回写给发送者(发送者应该有自己的receiveData 调用方法)接收者的回应)。

    要记住的一件事是,您可以通过 GameKit 发送的缓冲区有一个隐含的数据大小限制。您可能想尝试找出适合您的系统的东西(我得到的东西在 5K 和 10K 之间——由于某种原因它会有所不同)。您可能希望有代码将您的 NSData 拆分为块并管理数据的打包/解包。

    【讨论】:

    • 我希望你已经为 Apple 工作了。这个解释应该是官方文档。
    猜你喜欢
    • 2012-01-16
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2018-02-15
    相关资源
    最近更新 更多