1

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

这是我所做的

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

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

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

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

问题

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

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

谢谢你的帮助。

4

1 回答 1

4

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

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

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

由于网络抽象是GKSession接收者然后可以转身并使用它进入的相同会话实例didReceiveConnectionRequestFromPeer并使用它回写给发送者(发送者应该有自己的receiveData方法调用来自接收者的响应)。

The one thing to keep in mind is that there's an implicit data size limit on the buffer you can send through GameKit. You may want to experiment to find what that is for your system (I get something between 5K and 10K--for some reason it varies). You may want to have code to split up your NSData into chunks and manage packetizing/depacketizing the data.

于 2009-07-05T21:50:36.317 回答