2009-07-05 31 views
1

我想实现一个P2P应用程序。我试图做的是在设备之间传递一个自定义NSObject类的数据。我无法弄清楚什么时候GKSession调用了“receivedData”方法。iPhone - 如何在P2P传输数据

这里是我做了什么

  1. 通常的连接并显示出同龄人一个对话框

  2. 当应用程序接收到一个状态变化对等和国家相连,我在使用NSCoding方法发送数据给所有对等方(理想情况下应该在每个对等方接受连接时调用)

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

的问题是会话:同行:didChangeState:方法是没有得到所谓的两个设备上。它只是在点击PeerPicker警报中的“连接”按钮的设备上被调用。

问题

  1. 当didChangeState打来电话,为了谁?它们在连接时不应该为每个对等点呼叫吗?

  2. 何时调用receivedData:方法并为谁提供?是否要求确认收到消息(握手)还是仅传输其他对等方发送的数据?

感谢您的任何帮助。

回答

4

认为它更多的是'主/从'而不是'点对点'。据推测,双方已经与GameKit建立了联系,并派出了他们的代表。启动连接的一方会通过GKPeerStateConnected状态更改值通知接收方已接受邀请并已建立连接,因此可以开始发送内容。

然而,接收方首先通知有人想通过didReceiveConnectionRequestFromPeer委托方法与其通话。它会保存会话供以后使用,然后转向并呼叫acceptConnectionFromPeer接受它。从那以后,它通过receiveData方法获得任何结果。

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

由于网络抽象是GKSession接收方可以再回过头来使用它didReceiveConnectionRequestFromPeer得到了相同的会话实例,并用它来写回给发送者(谁应该有自己的receiveData方法调用响应从接收机) 。

需要记住的一件事是,您可以通过GameKit发送缓冲区上的数据大小限制。你可能想要试验一下,找出你的系统是什么(我得到5K和10K之间的东西 - 由于某些原因它有所不同)。你可能希望有代码将你的NSData分成块,并管理数据的打包/解包。

+0

非常感谢。这说明了事情.. – lostInTransit 2009-07-06 03:22:46