[英]iPhone - how is data transferred in P2P
我正在嘗試實現P2P應用程序。 我嘗試做的是在設備之間傳輸自定義NSObject類的數據。 我無法弄清楚GKSession何時調用“receivedData”方法。
這就是我所做的
通常的連接並顯示與對等方的對話框
當應用程序收到對等體的狀態更改且狀態為已連接時,我正在使用NSCoding方法將數據發送到所有對等體(理想情況下,當每個對等體接受連接時應調用此數據)
在receivedData中,我正在解碼NSData並返回NSObject實例
問題是session:peer:didChangeState:在兩個設備上都沒有調用方法。 它只是在設備上調用,該設備點擊了PeerPicker警報中的“連接”按鈕。
問題
什么時候調用didChangeState並為誰調用? 在連接時,不應該為每個對等體調用它嗎?
何時調用receiveData:方法並為誰調用? 是否要求確認收到消息(握手)或僅傳輸其他對等方發送的數據?
謝謝你的幫助。
可以把它想象成“主/從”而不是“點對點”。 據推測,雙方都已經與GameKit建立並分配了他們的代表。 啟動連接的一方通過GKPeerStateConnected
狀態更改值得到通知,接收方已接受邀請並已建立連接,因此可以開始發送內容。
然而,接收方首先注意到有人想通過didReceiveConnectionRequestFromPeer
委托方法與之交談。 它保存會話供以后使用,然后轉身並調用acceptConnectionFromPeer
接受它。 從那時起,它獲取通過receiveData
方法發送的任何內容。
執行此操作的最佳方法是使用一個小型狀態機來管理每一方所處的狀態。發送方僅在獲得GKPeerStateConnected
事件時才發送。 一旦接收到連接請求,接收器就會進入connected
狀態,因此它可以在開始獲取數據之前進行任何需要進行的設置。
由於網絡抽象是GKSession
,接收器然后可以轉向並使用它在didReceiveConnectionRequestFromPeer
獲得的相同會話實例,並使用它回寫給發送者(誰應該使用接收者的響應調用自己的receiveData
方法)。
要記住的一件事是,您可以通過GameKit發送緩沖區的隱含數據大小限制。 您可能想要嘗試找到適合您系統的內容(我得到的介於5K和10K之間 - 由於某種原因它會有所不同)。 您可能希望使用代碼將NSData拆分為塊並管理打包/解包數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.