客户端/服务器GKSessions

Stu*_*ing 4 iphone objective-c gamekit

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

目前发生的事情是服务器正在发送数据,这只是一个包含服务器时间的字符串.

然而,问题开始,当我有一个客户端已经连接到服务器然后我连接另一个客户端..问题是:第二个连接的客户端由于某种原因也连接到第一个客户端.

我希望能够不连接到其他客户端,只需连接到服务器.任何帮助都会很棒

Fat*_*tie 8

你的头上钉了一针:

奇怪的是,GK允许"任意对任何"模式.

这在Apple技术上是一个真正令人印象深刻的成就

但是!!! ........认识到这是一个非常不寻常的选择非常重要.在网络 - 对于游戏 - 你几乎总是想要一个"正常"的客户端 - 服务器模型.

在大约30年的时间里,已经建立了大量的科学,关于使用普通的客户端 - 服务器"辐射"模型进行网络连接.事实上,对于游戏编程,99%的时间你肯定需要一个标准的客户端 - 服务器"辐条"模型.

这有点重复:

(1)Apple在制作GK时创建了一种极不寻常的"点对点"模式.

(2)这在技术上令人震惊,但是,

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

(4)非常令人困惑:所有文档都谈到了P2P模式.这很令人困惑,因为:如果您不熟悉网络编程,它会让您认为这是"正常的".事实上,在制作真正的普通游戏时,你很可能永远不会使用P2P模式.

重复!

如果您不熟悉网络,当您在Apple的doco中看到P2P模式的所有提及时,重要的是要意识到(惊人的)P2P功能更具新意.事实上,对于基本上所有的游戏网络,你肯定需要正常的"日常"客户端 - 服务器"辐射式"网络.

只是为了水晶般清澈......它是非常多的!使用普通的客户端 - 服务器"辐条"模型更容易进行真实的网络连接.

P2P模式"真的很聪明",你肯定可以花一些时间来试验它.例如,只需"向所有连接的设备发送聊天"即可.

但是再次(如果你是一个新的网络程序员),你应该意识到这是一个新奇事物.您必须使用普通的日常客户端 - 服务器模型进行编程.

所以......................

鉴于您将使用正常的日常客户端 - 服务器模型进行编程.

奇怪的是,你的第一份工作变得"禁用"P2P方面!!!!!

如果你知道如何,这很容易.这是如何做到的......

sessionMode:GKSessionModeServer .. on the server.
sessionMode:GKSessionModeClient ..  on the client.
Run Code Online (Sandbox Code Playgroud)

因此,对于正常的客户端 - 服务器编程,请不要在任何地方使用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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

只是重复一遍.你很可能不想使用P2P模型:所以,以上所有内容都解释了"如何禁用P2P内容".

再一次重复绝对清晰:

GK(surpriginsly)包含P2P模式.这在技术上是惊人的.当然,您可以使用P2P模式来解决简单的网络问题(特别是类似聊天的问题).在实践中,任何真实游戏(无论是FPS,体育游戏还是其他)的所有典型网络需求都必须在普通的客户端 - 服务器范例中完成.(使用P2P模式会非常困难.)

因此,有必要作为"第一步"知道如何在GK中"不使用"P2P系统 - 这在上面已经详细说明了.

(如果你想使用P2P系统 - 你已经完成了设置,那就去吧!!)

如果你能弄清楚所有细微之处,GK真是太棒了.使用GK和ASIHttpRequest,您基本上可以在计算机之间执行任何操作.

这个问题已经敲响了头脑........ GK有一个(非常不寻常的)P2P模式,文档侧重于P2P模式,这可能会让新手感到困惑.P2P再次非常聪明,但通常你不需要P2P模式.您需要一个普通的客户端与服务器辐条模型,这种模型更容易编程.希望能帮助到你!

  • "(3)点对点模型是如此完全奇特,它从来没有,一次 - 不是 - 已经被任何开发者实际使用过." 错了,我现在用了几次,虽然你认为它是古怪而无用的狗屎,事实是:事实并非如此. (10认同)
  • 是的,它可能不是一个服务器和许多客户端的常用方法,但是,嘿,如果你离开这个想法,GameKit是惊人的!有这么多游戏,服务器只是作为广播公司... (2认同)