GameKit:向其他玩家发送可靠的NSData?

时间:2011-04-02 19:18:22

标签: iphone ios nsdata gamekit game-center

好的,我设法在两个玩家之间创造了一场比赛。现在我将做一些关于向玩家发送数据的测试。

我没有得到关于NSData的解释。基本上,它是什么?如何将dunno阵列发送给其他玩家?

Apple提到数据包可能会丢失。但是有一种“可靠”模式可以防止这种情况发生。但我找不到这样的。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

是的,您必须制定自己的OWN协议。 “制定协议”是你自己做的事情。像...基本上在服务器端

// the message arrives and you then do this...
[data getBytes:&getMe length:sizeof(CommsProt)];

而在客户端发送消息,你这样做......

NSData * data = [NSData dataWithBytes:&sendMe length:sizeof(CommsProt)];
// ...now send that data using GameKit or whatever system you end up with

并且您定义了您的协议​​ - 至少是数据块 - 如下所示:

typedef struct _CommsProt
    {
    BOOL        happyThing;
    someThings  wotJustHappened;
    float       happyValue;
    float       anotherHappyValue;
    // etc
    }
    CommsProt;

如果您是GK的新手,请注意这一重要提示......

Client/Server GKSessions

这也可以帮助......

Most effective way to do networking on Mac/iPhone?

一些有用的笔记......

(i)“客户”和“服务器”表示没有。您可以向任一方向发送手提包信息(例如上面的“CommsProt”)。如果你想要并且引用一个,以服务器结束(特别是如果你有一个集线器类型的安排),那很好。但它只在你的头脑中。 (顺便说一下,通常你可以在每个方向使用不同的数据结构,这非常好。)

(ii)关于插座。如果您大量使用网络,则必须处理套接字并编写自己的套接字代码。但是,您很可能选择一个网络层,您甚至不必说“套接字”这个词!例如,GameKit + Bonjour完全负责为您处理套接字,并且该组合负责处理 另一个难以置信的难题 ,即查找您的一个客户端/服务器。如果你是新手,我建议你现在完全放弃套接字,并使用GameKit等系统(或Windows上的等同物)作为你的网络层。

(iii)确实AT FIRST只使用像GameKit这样非常简单的东西,而你弄清楚你的协议和所有其他令人头疼的问题。稍后,如有必要,您可以重写网络层,或者切换到您听到的其他一些软件包。令人高兴的是,上面代码示例的所有内容都将保持不变,只有网络层才会发生变化。

(iv)关于WiFi。 GameKit和大多数便利包与物理层完全无关:它们会为您处理它。 GK工作正常,但手机已连接 - 蓝牙,以太网,等等!实际上,您“不会知道”正在使用的物理层。 (有时候很烦人,你无法控制它:放手吧,用户不会在乎。)