老实说,我会从经典的LAMP开始。拿出一个股票Apache服务器和一个mysql数据库,并把你的Python脚本放在cgi-bin目录下。他们发送和接收JSON而不是HTTP的事实并没有太大的区别。
当然,这显然不会是最灵活或可扩展的解决方案,但它会迫使您尽早面对实际问题。
你将遇到的第一个问题是游戏状态。你声称没有共享状态,但这并非对 - 卡组中的牌,桌上的赌注,轮到它的状态,这是所有状态,在多个玩家之间共享,在服务器上进行管理。这些命令中的任何一个还能工作吗?所以,你需要一些方法来在CGI脚本的不同实例之间共享状态。经典的解决方案是将状态存储在数据库中。
当然,您还需要首先处理用户会话。细节取决于您选择哪种会话管理方案,但最大的问题是如何将断开/超时从较低级别传播到应用程序级别。如果有人把20美元放在桌子上然后断开连接,会发生什么?你必须考虑所有可能的用例。
接下来,您需要考虑可伸缩性。你想要数百万游戏?那么,如果有一个包含所有游戏状态的单个数据库,则可以根据需要在它之前安装尽可能多的Web服务器 - John Doe可能在server1上,而Joe Schmoe在server2上,但他们可以在同一个游戏中。另一方面,只要你有办法迫使同一个游戏中的人在同一台服务器上见面,你就可以为每个服务器分配一个数据库。哪一个更有意义?无论哪种方式,你如何负载平衡服务器之间。 (你不仅希望让他们全部忙碌,你想避免4个玩家都准备好去的情况,但他们在3个不同的服务器上,所以他们不能玩对方......)。
这个过程的最终结果将是一个服务器的巨大混乱,运行在你希望的容量的1%处,你不知道如何维护。但是你会更详细地考虑你的问题空间,并且你也学会了服务器开发的基础知识,从长远来看这两者可能都是更重要的。
如果你有足够的时间,我会把所有东西都从头开始重新编写,通过设计一个自定义的TCP协议,在Twisted中实现一个服务器,保持内存中的游戏状态,以及编写简单的自定义代理而不是标准的负载均衡器。
最重要的决定是使用哪个框架。如果这是一种学习体验,那么最重要的问题就是你想要学习什么。您对设计REST服务或Internet协议感兴趣吗?学习像Twisted或asio这样的中级框架,或者像Tomcat或JBoss这样的高级容器? (一般来说,容器意味着更少的代码,但更多的管理。)你有三种语言之间的任何偏好?但除此之外,还存在如下问题:客户端会话之间需要共享多少数据? – abarnert
伟大的问题。我的最终目标是测试不同的AI和机器学习技术来玩游戏的“测试操场”。客户端不需要共享任何东西,他们只是互相玩耍并学习,使用服务器作为游戏管理员。 – lollercoaster
你应该已经开始说明所有的玩家都是非人类玩家。为什么你需要一个网络呢?只需在同一台机器上实例化AI在游戏中的玩法并让它们通过内存交换状态。通过消除网络,您可以获得比通过在自己的机器上运行每个AI所获得的任何计算增益更高的性能。 AI计算甚至不需要平行。 –