回合制多人游戏:WCF 还是 Socket?

10
我希望就我的问题获得一些建议。
我们正在创建一个具备以下特点的多人在线国际象棋游戏:
  1. 游戏将支持非常大量的并发用户
  2. 我们将在磁盘上物理保存每个游戏动作(例如,使用SQL Server数据库)
  3. 我们也会为会话利用同样的SQL Server
  4. 多个游戏服务器将被用于负载均衡/可扩展性
  5. 所有游戏服务器之间都将相互连接
  6. 所有游戏服务器也将连接到该SQL Server
  7. 由于这是一个国际象棋游戏,因此只有两个用户可以玩游戏,但
  8. 无限数量的用户可以实时观看该游戏作为观众(广播)
  9. 观众/游戏用户将有选项发送和接收聊天消息,私下或公开地。
  10. 我们将在数据库中维护自己的用户列表。因此,我们需要一个自定义身份验证系统。
客户端将是桌面Windows Forms / WPF应用程序。我们也在考虑在线基于浏览器的版本,但我们已经将它放在未来,目前我们专注于桌面版本。
现在我的问题是?
  1. 我们应该使用哪种技术,Socket还是WCF?
  2. 序列化的首选方式是XML、二进制还是自定义二进制?
欢迎提供任何其他建议/建议/指导。
谢谢
2个回答

8
这是我的意见。
套接字
(+++)比WCF更快(特别是如果您使用UDP) (+)未来硬件开销较少,因为使用套接字的应用程序具有更好的可扩展性 (-)开发时间更长 (-)开发成本更高 (-)您需要设计自己的协议或使用足够适合的协议 (-)API难以扩展 (-)对于第三方开发人员来说很困难
WCF
(+)避免任何传输级别问题 (+)易于扩展API (+)节省开发时间 (+)易于提供第三方API (+)开发成本较低 (-)比套接字慢 (-)由于使用WCF的应用程序可扩展性较差,因此您将花费更多的硬件开销
无论您要使用哪种序列化方式,WCF都会比套接字慢。
无论如何,您不会使用“HipHop for PHP”。我认为,答案是使用WCF创建简化的客户端和服务器应用程序。使用不同的绑定、序列化等加载到最大程度(如您所预计的)。如果WCF能处理负载并具有良好的储备,则可以使用它。否则,请使用套接字。
也许最好的方法是同时使用这两种技术。在性能至关重要的情况下使用套接字(例如,连接游戏服务器),在其他部分使用WCF(例如,发送和接收聊天消息)。
我相信还有很多其他论点支持这两种技术。但是我认为问题是:您想更快地获得还是更容易维护。这是一个经常添加功能的应用程序,还是一个负载将以几何级数增长的应用程序等等。

只要有良好的文档和示例代码,任何事情都不难。 - gbjbaanb
当然可以。但是,如果我可以让开发者只需添加服务引用,为什么要让他使用自定义套接字协议呢? - Daniil Novikov
谢谢你的时间,Daniil。实际上,我们唯一困惑的是关于 WCF 的可扩展性问题。WCF 是否可以在连接多个服务器时工作?这是主要问题。我们至少会有 4 到 5 台物理机器用于游戏服务器。我们希望系统足够灵活,以便随着负载的增加轻松添加更多节点。 - sallushan
与您的问题相关的套接字没有区别。关于“WCF是否适用于多个连接的服务器?”这个问题没有意义,但答案是肯定的。无论如何,在这两种情况下,可扩展性和所有其他应用程序属性不仅取决于技术,而且还取决于设计方式。因此,我认为最好的方法是在正确的地方使用正确的技术。设计您的项目。决定何时应该使用套接字以及何时可以使用WCF。通过一些测试和检查来证明您的概念。 - Daniil Novikov
WCF是基于HTTP协议的,因此比通过原始套接字发送的二进制负载要慢得多(例如,有一些替代方案可以添加更少的开销,使用起来同样容易),而且如果您想要一个Web服务连接到多个服务器,您将不得不引入负载均衡器。我发现你也会想在通信通道的两端都使用WCF,因为WCF Web套接字与Java和PHP Web服务略有不兼容!而且 - 最重要的是,如果您使用WCF,您仍然可以使用套接字连接,只需更改绑定即可。 - gbjbaanb

3
除了Daniil的回答之外:
抽象出你的通信代码并使用WCF开始。如果最终速度太慢(我不认为会),你仍然可以相对容易地切换到套接字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接