我有一个应用程序,如果用户选择设备作为服务器,它会在服务器模式下创建一个 GKSession,如果它选择 cient,它会在客户端模式下创建一个 GKSession。
目前发生的事情是服务器正在发送数据,这只是一个包含服务器时间的字符串。
然而,问题开始了,当我有一个客户端已经连接到服务器然后我连接另一个客户端..问题是:第二个连接的客户端也连接到第一个客户端出于某种原因。
我希望能够不连接到其他客户端而只连接到服务器。任何帮助都会很棒
我有一个应用程序,如果用户选择设备作为服务器,它会在服务器模式下创建一个 GKSession,如果它选择 cient,它会在客户端模式下创建一个 GKSession。
目前发生的事情是服务器正在发送数据,这只是一个包含服务器时间的字符串。
然而,问题开始了,当我有一个客户端已经连接到服务器然后我连接另一个客户端..问题是:第二个连接的客户端也连接到第一个客户端出于某种原因。
我希望能够不连接到其他客户端而只连接到服务器。任何帮助都会很棒
你一针见血:
奇怪的是,GK 允许“任意对任意”模型。
从技术上讲,这是 Apple 真正令人印象深刻的成就
但 !!!........认识到这是一个非常不寻常的选择非常重要。在网络中——对于游戏——你几乎总是想要一个“正常”的客户端-服务器模型。
大约 30 年来,关于使用普通客户端-服务器“辐条”模型进行网络的大量科学已经确立。事实上,对于游戏编程,99% 的时间你肯定需要并且想要一个标准的客户端-服务器“辐条”模型。
这值得重复:
(1)苹果在做GK的时候创造了一种极不寻常的“点对点”模式。
(2) 这在技术上是惊人的,但是,
(3) 这种新颖的 P2P 技术实际上不会用于非常典型的游戏网络编程。
(4) 非常混乱:所有文档都在谈论 P2P 模式。这是令人困惑的,因为:如果您是网络编程的新手,它会让您认为这是“正常的”。事实上,在制作真正的普通游戏时,你很可能根本不会使用 P2P 模式。
重复!
如果您是网络新手,当您在 Apple 的文档中看到 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(奇怪地)包含 P2P 模式。这在技术上是惊人的。当然,您可以使用 P2P 模式来解决简单的网络问题(尤其是类似聊天的问题)。在实践中,任何真实游戏(无论是 FPS、体育游戏还是其他)的所有典型网络需求都必须在普通的客户端-服务器范式中完成。(使用 P2P 模式将非常困难。)
因此,作为“第一步”,有必要知道如何“不使用”GK 中的 P2P 系统——这在上面已经详细解释过。
(如果你确实想使用 P2P 系统——你已经准备好了,去吧!!)
如果你能弄清楚所有的细微之处,GK 就很棒。使用 GK 和 ASIHttpRequest,您基本上可以在计算机之间至少以基本方式做任何事情。
这个问题一针见血........ GK 有一个(非常不寻常的)P2P 模式,并且文档集中在 P2P 模式上,这可能会让新手感到困惑。同样,P2P 非常聪明,但通常您不需要 P2P 模式。您需要一个普通的客户端-服务器-辐条模型,它非常容易编程。希望能帮助到你!