我有一个设置的应用程序,这样如果用户选择设备作为服务器,它会在服务器模式下创建一个GKSession,如果它选择了cient,它会在客户端模式下创建一个GKSession。
目前发生的事情是服务器正在发送数据,这只是一个包含服务器时间的字符串。
问题开始了,当我有一个客户端已经连接到服务器然后我连接另一个客户端..问题是:第二个连接的客户端由于某种原因也连接到第一个客户端。
我希望无法连接到其他客户端,只需连接到服务器即可。任何帮助都会很棒
答案 0 :(得分: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.
因此,对于正常的客户端 - 服务器编程,请不要在任何地方使用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模式来解决简单的网络问题(特别是类似聊天的问题)。在实践中,任何真实游戏(无论是FPS,体育游戏或其他什么)的所有典型网络需求必须在普通的客户端 - 服务器范例中完成。 (使用P2P模式会非常困难。)
因此,有必要作为“第一步”知道如何在GK中“不使用”P2P系统 - 这在上面已详细解释。
(如果你想使用P2P系统 - 你已经完成了设置,那就去吧!!)
如果你能弄清楚所有细微之处,那么GK太棒了。使用GK和ASIHttpRequest,您基本上可以在计算机之间执行任何操作。这个问题已经触头了........ GK有一个(非常不寻常的)P2P模式,文档专注于P2P模式,这可能令人困惑对新人来说。 P2P再次非常聪明,但通常你不需要P2P模式。您需要一个普通的客户端与服务器辐条模型,这种模型更容易编程。希望它有所帮助!