这是我目前所处的位置。我正在设计一款纸牌游戏,旨在利用主要组件进行未来的工作。让我感到困惑的部分是在服务器和客户端之间创建一个抽象层。启动服务器,然后一个或多个客户端可以(本地或远程)连接。我正在设计一个胖客户端,但我的朋友正在寻找一个基于Web的客户端。我想以允许各种不同客户端调用一组通用服务器命令的方式设计服务器。
因此,首先,我想创建一个管理游戏规则和玩家交互的“服务器”,以及本地CLI上的“客户端”(为方便起见,我正在运行Ubuntu Linux)。我试图充实这两个部分应该如何交互,而不是强制要求未来的客户端基于CLI或在本地机器上。
我发现以下两个有益的问题,但不完全回答上述问题。
我不需要任何功能齐全的东西;我只想建立抽象的基本机制,以便生成的模型代码恰当地反映了这种关系:客户端/服务器关系与使用一体化应用程序有不同的假设。
我从哪里开始?你推荐什么资源?
免责声明: 我熟悉各种语言的代码和一般编程/逻辑概念,但是编写大量代码的实际经验很少。这个宠物项目试图纠正这个问题。
另外,我知道这些信息已经存在,但我的印象是我错过了树林。
答案 0 :(得分:2)
阅读RESTful架构。
胖客户端可以使用REST。它将使用urllib2
来生成服务器的RESTful请求。它可以用JSON表示法交换数据。
Web客户端可以使用REST。它可以使简单的浏览器HTTP请求或Javascript组件可以使用JSON生成更复杂的REST请求。
您的服务器可以使用任何简单的WSGI组件构建为简单的WSGI应用程序。您在标准库中有很好的,或者您可以使用Werkzeug。您的服务器只接受REST请求并进行REST响应。您的服务器可以使用HTML(对于浏览器)或JSON(对于胖客户端或Javascript客户端)。
答案 1 :(得分:2)
我会考虑在HTTP上建立所有服务器/客户端交互 - 可能与JSON有效负载有关。这不直接允许服务器启动的交互(“服务器推送”),但是(新的但已经传统的;-)解决方法是AJAX-y(尽管X没有意义,因为我建议JSON有效负载,而不是XML那些;-) - 客户端发起异步请求(通过一个单独的线程或其他)到服务器上的特殊URL,服务器响应那些(实际上)“推”的请求。从你的说法看,这种方法的局限性可能不是问题。
以这样的术语指定交互的关键优势在于它们完全独立于编程语言 - 因此Javascript中基于Web的客户端将与您在Python等中的CLI一样可行。当然,服务器可以作为特殊情况驻留在localhost上,但是没有限制,因为HTTP URL可以指定运行服务器的任何主机;等等。
答案 2 :(得分:2)
首先,无论客户端的位置或类型如何,您都将通过已建立的基于消息的界面进行通信。所有客户端都将基于一组通用的请求和响应进行操作,服务器将根据游戏状态根据其有效性处理和拒绝这些请求和响应。无论您是在同一台计算机上处理本地客户端还是通过HTTP处理远程客户端,从抽象的角度来看都无关紧要,因为他们都将通过同一组请求/响应进行通信。
这归结为您的协议。您的协议应该是客户端和服务器之间定义明确,技术合理的语言,允许客户a)有效参与,b)公平参与。该协议应定义客户端可以执行的消息(“移动”),以及服务器何时以及如何做出反应。
在你开始使用游戏逻辑之前,你的协议应该完全充实并记录下来 - 这两者本质上是相互联系的,你将通过首先合理地定义你的协议来节省大量的时间和精力。
你的协议是客户端和服务器之间的抽象,它也将作为两者的设计文档和编程指南。
协议设计完全是关于状态,状态转换和验证。游戏服务器通常对于每个游戏实例具有一组相当常见的通用状态,例如初始化,大厅,游戏,暂停,回顾,关闭游戏等......
这些状态中的每一个都具有与之相关的重要状态数据。例如,服务器端的“大厅”状态可能包含每个玩家的已知状态...自上次消息或ping后多长时间,玩家正在做什么(选择头像,切换设置,转到冰箱)等)。在代码中组织和管理状态和子状态数据非常重要。
管理这些状态以及每个状态的相关数据要求是一个应该精心规划的过程,因为它们与工作量和项目复杂性直接相关 - 这非常重要,如果您使用此项目也是很好的做法加入更大的事情。
此外,你必须记住,如果你有一个游戏,你让人们玩,人们会作弊。这是生活中的事实。为了最大限度地减少这种情况,您必须仔细设计协议和状态管理,以便只允许有效的状态转换。永远不要相信单个客户端数据包。
对于客户端/服务器状态的每个排列,您必须强制执行一组有限的有效游戏消息,并且您必须非常小心您允许玩家执行的操作以及允许他们执行此操作。
项目复杂性通常呈指数级而非线性 - 客户端/服务器游戏编程通常是一种很好/痛苦的学习方法。好问题。希望这有帮助,祝你好运!