2

这就是我现在的位置。我正在设计一款纸牌游戏,旨在将主要组件用于未来的工作。让我束手无策的部分是在服务器和客户端之间创建一个抽象层。启动服务器,然后一个或多个客户端可以连接(本地或远程)。我正在设计一个胖客户端,但我的朋友正在考虑做一个基于 Web 的客户端。我想以允许各种不同客户端调用一组通用服务器命令的方式设计服务器。

因此,首先,我想创建一个管理游戏规则和玩家交互的“服务器”,以及本地 CLI 上的一个“客户端”(为了方便起见,我正在运行 Ubuntu Linux)。我试图充实这两个部分应该如何交互,而不要求未来的客户端基于 CLI 或在本地机器上。

我发现以下两个问题是有益的,但不能完全回答上述问题。

我不需要任何功能齐全的东西。我只想建立抽象的基本机制,以便生成的模型代码适当地反映这种关系:客户端/服务器关系与一体化应用程序有不同的假设。

我从哪里开始?你推荐什么资源?

免责声明:我熟悉各种语言的代码和一般编程/逻辑概念,但几乎没有编写大量代码的实际经验。这个宠物项目是纠正这一点的尝试。

此外,我知道信息已经存在,但我有一种强烈的印象,即我只见树木不见森林。

4

3 回答 3

2

阅读 RESTful 架构。

你的胖客户端可以使用 REST。它将用于urllib2向服务器发出 RESTful 请求。它可以以 JSON 表示法交换数据。

Web 客户端可以使用 REST。它可以发出简单的浏览器 HTTP 请求,或者 Javascript 组件可以使用 JSON 发出更复杂的 REST 请求。

您的服务器可以使用任何简单的 WSGI 组件构建为简单的 WSGI 应用程序。您在标准库中有不错的,或者您可以使用Werkzeug。您的服务器只接受 REST 请求并做出 REST 响应。您的服务器可以使用 HTML(用于浏览器)或 JSON(用于胖客户端或 Javascript 客户端)。

于 2009-08-18T00:35:39.720 回答
2

我会考虑基于 HTTP 的所有服务器/客户端交互——可能使用 JSON 有效负载。这并不直接允许服务器启动的交互(“服务器推送”),但是(新的但已经传统的;-)解决方法是 AJAX-y(尽管 X 没有什么意义,因为我建议使用 JSON 有效负载,而不是 XML one;-) -- 客户端向服务器上的特殊 URL 发起异步请求(通过单独的线程或其他方式),服务器响应这些请求以(实际上)执行“推送”。从您所说的看来,这种方法的局限性可能不是问题。

以这样的术语指定交互的关键优势在于它们完全独立于编程语言——因此 Javascript 中的基于 Web 的客户端将与 Python 中的 CLI 等一样可行。当然,服务器可以作为特例存在于 localhost 上,但没有限制,因为 HTTP URL 可以指定运行服务器的任何主机;等等等等

于 2009-08-18T00:39:44.183 回答
2

首先,无论客户端的位置或类型如何,您都将通过已建立的基于消息的接口进行通信。所有客户端都将基于一组通用的请求和响应进行操作,服务器将根据游戏状态根据其有效性处理和拒绝这些请求和响应。无论您是在同一台机器上处理本地客户端还是通过 HTTP 处理远程客户端,从抽象的角度来看都无关紧要,因为它们都将通过同一组请求/响应进行通信。

这归结为您的协议。您的协议应该是客户端和服务器之间定义明确且技术上合理的语言,允许客户端 a) 有效参与,b) 公平参与。该协议应定义客户端可以执行哪些消息(“移动”),以及何时以及服务器将如何响应。

甚至在开始游戏逻辑之前,您的协议就应该被完全充实和记录——这两者本质上是相互关联的,通过首先完整地定义您的协议,您将节省大量浪费的时间和精力。

你的协议客户端和服务器之间的抽象,它也将作为两者的设计文档和编程指南。

协议设计都是关于状态、状态转换和验证的。游戏服务器通常为每个游戏实例设置一组相当常见的通用状态,例如初始化、大厅、游戏玩法、暂停、回顾、关闭游戏等……

这些状态中的每一个都有与之相关的重要状态数据。例如,服务器端的“大厅”状态可能包含每个玩家的已知状态……距离最后一条消息或 ping 的时间,玩家正在做什么(选择头像,切换设置,去冰箱, ETC。)。在代码中组织和管理状态和子状态数据很重要。

管理这些状态以及每个状态的相关数据需求是一个应该精心规划的过程,因为它们与工作量和项目复杂性直接相关 - 如果您使用这个项目来加强,这非常重要,也是很好的实践进入更大的事情。

另外,您必须记住,如果您有游戏,并且让人们玩,人们会作弊。这是生活中的事实。为了最大限度地减少这种情况,您必须仔细设计您的协议和状态管理,以只允许有效的状态转换。永远不要相信单个客户端数据包。

对于客户端/服务器状态的每一种排列,您必须强制执行一组有限的有效游戏消息,并且您必须非常小心您允许玩家做什么以及何时允许他们这样做。

项目复杂性通常呈指数级而非线性 - 客户端/服务器游戏编程通常是学习这一点的好方法/痛苦方法。好问题。希望这会有所帮助,祝你好运!

于 2009-08-18T01:08:35.583 回答