客户端/服务器GKSession

我有一个应用程序,如果用户select设备作为服务器,它将在服务器模式下创build一个GKSession,如果它select了cient,则在客户端模式下创build一个GKSession。

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

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

我想能够不能连接到其他客户端,只需连接到服务器。 任何帮助将是伟大的

你已经击中了头部:

奇怪的是,GK允许“任何”任何模型。

这是苹果在技术上真正令人印象深刻的成就

但是! ……..认识到这是一个非常不寻常的select是非常重要的。 在networking游戏中,你几乎总是需要一个“正常的”客户 – 服务器模型。

30多年来,关于使用正常的客户端 – 服务器“辐射”模型进行联网,大量的科学已经build立起来。 事实上,对于游戏编程,99%的时间你肯定需要,并希望,一个标准的客户端服务器“发言”模式。

这再次重申:

(1) 苹果公司在制造GK时创造了一种非同寻常的“点对点”模式

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

(3)这种新颖的P2P技术实际上不能用于非常典型的游戏networking编程。

(4)非常令人困惑的是:所有文档都谈到P2P模式。 这是令人困惑的,因为:如果你不熟悉networking编程,会让你觉得这是“正常的”。 事实上,在制作真正的普通游戏时,您绝对不会使用P2P模式。

重复!

如果你还不熟悉networking ,那么当你看到苹果公司的doco中提到P2P模式的时候,重要的是要认识到(惊人的)P2Pfunction更具有新颖性。 事实上,对于基本上所有的游戏networking,你一定需要普通的“日常”的客户端 – 服务器“辐射式”networking。

只要水晶般清澈..它是非常非常多! 使用普通的客户端 – 服务器“辐条”模型更容易实现真实的networking连接。

P2P模式是“非常聪明”,你可以花一些时间来试验它。 例如,对于每个连接的设备“发送聊天”都是可以的。

但是,如果你是一个新的networking程序员,你应该意识到这是一个新鲜事物。 您将不得不使用普通的日常客户端服务器模式进行编程。

所以………………….

因为你打算在普通的日常客户端 – 服务器模式下进行编程。

奇怪的是,你的第一份工作变得“禁用”了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(surpriginsly)包含一个P2P模式。 这在技术上是惊人的。 当然,您可以使用P2P模式解决简单的networking问题(特别是聊天类问题)。 实际上,任何真实游戏(无论是FPS,体育游戏还是其他)的所有典型networking需求都必须在普通的客户端 – 服务器模式下完成 。 (使用P2P模式将会非常困难。)

因此,作为知道如何“不使用”GK中的P2P系统的“第一步”是必要的。

(如果你想要使用P2P系统 – 你们都准备好了,那就去!!)

GK很棒,如果你能弄清楚所有的细节。 使用GK和ASIHttpRequest,至less基本上可以在计算机之间做任何事情。

这个问题已经碰到头了…….. GK有一个(非常不寻常的)P2P模式, 文档集中在P2P模式 ,这可能会混淆新手。 P2P再次是非常聪明的,但是通常你不需要P2P模式。 你需要一个正常的客户服务器辐条模型,这是非常容易编程的。 希望它有帮助!