代码之家  ›  专栏  ›  技术社区  ›  StuStirling

客户机/服务器GKSessions

  •  4
  • StuStirling  · 技术社区  · 14 年前

    我有一个应用程序是这样设置的:如果用户选择设备作为服务器,它将在服务器模式下创建一个GKSession;如果用户选择cient,它将在客户端模式下创建一个GKSession。

    现在发生的是服务器正在发送数据fine,它只是一个包含服务器时间的字符串。

    但是,当一个客户机已经连接到服务器,然后再连接另一个客户机时,问题就开始了。。问题是:由于某种原因,第二个连接的客户端也连接到第一个客户端。

    我希望不能连接到其他客户端,只连接到服务器。任何帮助都很好

    1 回复  |  直到 10 年前
        1
  •  8
  •   Fattie    10 年前

    你已经一针见血了:

    奇怪的是,GK允许“任意对任意”模式。

    这是一个真正令人印象深刻的成就,在技术上,由苹果公司

    但是!!! ……认识到这是一个非常不寻常的选择是非常重要的。在网络-游戏-你几乎总是想要一个“正常”的客户端-服务器模式。

    在大约30年的时间里,大量的科学已经建立起来,关于使用普通的客户机-服务器“说话人”模型进行联网。事实上,对于游戏编程来说,99%的时间你肯定需要和想要一个标准的客户机-服务器“轮辐”模型。

    这需要重复:

    (一) 苹果创造了一种极不寻常的“点对点”模式 当他们做GK的时候。

    (2) 那就是 技术惊人 ,但是,

    (3) 这种新型的P2P技术实际上不会被用于非常典型的游戏网络编程中。

    (4) 非常令人困惑:所有 文档 讨论P2P模式。这是令人困惑的,因为:如果你是网络编程新手,它会让你认为这是“正常的”。事实上,在制作真正的普通游戏时,你很可能永远不会使用P2P模式。

    重复一遍!

    如果你是网络新手 ,当你在苹果的doco中看到所有提到P2P模式的地方时,重要的是要意识到(令人惊奇的)P2P功能更加新奇。事实上,对于基本上所有的游戏网络,你肯定需要正常的“日常”客户端服务器“发言式”网络。

    完全清楚。。太多了,太多了,太多了!!使用普通的客户机-服务器“轮辐”模型更容易进行真实的网络连接。

    P2P模式是“非常聪明”的,你可以花一些时间来尝试它。例如,只需向连接的每个设备“发送聊天信息”就可以了。

    但同样的(如果你是一个新的网络程序员),你应该意识到这是一个相当新奇的东西。你将不得不使用一个正常的,日常的,客户机-服务器模式进行编程。

    所以。。。。。。。。。。。。。。。。。。。。。。

    假设您将使用普通的日常客户机-服务器模型进行编程。

    奇怪的是,你的第一份工作变成了“禁用”P2P方面!!!!!

    如果你知道怎么做,这很容易。这正是如何做到这一点。。。

    sessionMode:GKSessionModeServer .. on the server.
    sessionMode:GKSessionModeClient ..  on the client.
    

    因此,对于普通的客户机-服务器编程,不要在任何地方使用GKSessionModePeer。

    其次,不要忘记你的客户 不执行 didReceiveConnectionRequestFromPeer:

    如果一切都不起作用的话! 在您的客户机中,在peer:didChangeState:,您需要这样做。。。

    // so this is in the CLIENT...
    -(void)session:(GKSession *)session peer:(NSString *)peerID
                    didChangeState:(GKPeerConnectionState)state
        {
        switch (state)
            {
            case GKPeerStateAvailable:
                // you have found the server!!
                // [session displayNameForPeer:peerID]
                self.theServerWeAreConnectedToPeerID = peerID;
                // you will definitely need to save that
                [session connectToPeer:theServerWeAreConnectedToPeerID
                    withTimeout:0];
                break;
    
            case GKPeerStateConnected:
                // MAKE SURE it's our server
                // not just some bizarre peers, etc etc.
                if ( [theServerWeAreConnectedToPeerID isEqualToString:peerID] )
                    {
                    // you are connected - launch your tick or whatever
                    }
                else
                    {
                    // completely ignore this!
                    }
                break;
    
            case GKPeerStateDisconnected:
                if ( [theServerWeAreConnectedToPeerID isEqualToString:peerID] )
                    {
                    // you have been disconnected from the server!!
                    }
                else
                    {
                    // weirdly this is telling you that one of your sister
                    // clients, has been disconnected from the server. IGNORE
                    }
                break;
    
    
            // GKPeerStateUnavailable .. likely not relevant
            case GKPeerStateUnavailable:
                // do nothing, ignore
                break;
            // from the modern doco..
            // "The delegate should ignore GKPeerStateConnecting changes
            // and implement the session:didReceiveConnectionRequestFromPeer:
            // method instead." .. blah blah .. for us that comment only
            // applies TO OUR SERVER, NOT here in the client.
            case GKPeerStateConnecting:
                // do nothing, ignore
                break;
            }
        }
    

    只是重复一下。很可能您不想使用P2P模型:因此,以上所有内容都解释了“如何禁用P2P功能”

    再次重复以获得绝对清晰:

    GK(superiginsly)包含P2P模式。这在技术上是惊人的。当然,您可以使用P2P模式解决简单的网络问题(尤其是类似聊天的问题)。在实践中,任何真实游戏(无论是FPS、运动游戏还是其他什么)的所有典型网络需求 必须在普通的客户机-服务器模式中完成 . (使用P2P模式将非常困难。)

    因此,作为“第一步”,了解如何在GK中“不使用”P2P系统是必要的——这在前面有详细的解释。

    (如果你真的想使用P2P系统-你已经准备好了,去吧!!)

    如果你能找出所有的微妙之处,GK就太棒了。使用GK和ASIHttpRequest,您基本上可以在计算机之间做任何事情,至少是以一种基本的方式。

    这个问题一针见血。。。。。。。。GK有一个(非常不寻常的)P2P模式,并且 文档集中在P2P模式上 ,这可能会让新来的人感到困惑。同样,P2P是非常聪明的,但是作为一个规则,你不想要P2P模式。你想要一个普通的客户机与服务器辐条模型,这是难以置信的更容易编程。希望有帮助!