【问题标题】:GameKit: sending reliable NSData to other players?GameKit:向其他玩家发送可靠的 NSData?
【发布时间】:2011-04-02 19:18:21
【问题描述】:

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

我不太明白关于 NSData 的解释。本质上,它是什么?我如何向其他玩家发送一个不知道的数组?

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

有什么想法吗?

【问题讨论】:

    标签: iphone ios nsdata gamekit game-center


    【解决方案1】:

    是的,您必须制定自己的 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) 实际上,首先只需使用 GameKit 之类的极其简单的东西,同时弄清楚你的协议和所有其他令人头疼的问题。稍后,如有必要,您可以重写网络层,或者,切换到您听说过的其他一些包。幸运的是,上面代码示例之前的所有内容都不会改变,只有网络层会改变。

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

    【讨论】:

    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多