基于客户端-服务器的游戏编写建议

4
我正在考虑编写一个基于服务器的游戏,多个客户端程序将连接到它。这个游戏(非常)基本上由一系列项目列表组成,用户可以“接受”其中的一个,这将从所有连接的计算机上删除该项目(这需要快速更新)。
我正在考虑为客户端使用Java小程序,因为我希望它能够在浏览器中运行(主要是在Windows系统下),并且更新速度很快。对于服务器方面,我想使用C++或Java,运行在Linux上(目前只是家用服务器,但可能会放在VPS上)。
之前的版本在浏览器中运行,并使用PHP+mySQL作为后端,但当多人连接时,服务器会受到很大压力(那时有大约8个人,最终需要处理更多)。用户可能都在同一物理位置(具有相同的公共IP地址),系统每秒可能会收到多个请求,所有这些请求都需要向客户端发送列表。
一些计算机可能有防火墙限制,所以您建议使用HTTP流量、自定义端口或通过SSH或某些现有协议进行通信?
是否有人可以提供一些提示(线程、单个项目的多个请求?)、工具、数据库(mySQL?)或API,帮助我开始这个项目?我更喜欢使用C++作为后端,因为它会更快,但使用Java可以让我重用代码。
谢谢!
2个回答

3

仅仅因为速度而使用C++是不明智的。除非你在客户端和服务器之间使用了10 GigE,否则性能差异很可能会被网络掩盖,对游戏的实际影响微乎其微。我建议使用C++或Java,因为这些语言可以让你更快地使游戏运行起来。


谢谢,我可能会使用C++,因为我唯一做过的Java是在Android上(现在需要学习swing来为客户端服务)。 - neuropie

2
对于寻找良好的C++网络API的任何人,我总是建议使用Boost.Asio。它具有平台无关性,因此您可以为Linux、Windows等编译服务器。但是,如果您对C++模板/boost不太熟悉,则代码可能有点压倒性。看一看,试一试。
就一般建议而言,根据上述描述,您似乎需要一个相对简单的服务器。我建议保持非常基本的单线程轮询循环。从连接的客户端读取消息(在多个套接字上等待),并适当地响应。这消除了围绕访问列表和其他同步问题的多个访问的任何问题。
我还建议,在重新编写初始版本之前,尝试改进它,如您所述:
“系统每秒会收到多个请求,所有这些请求都需要将列表发送回客户端。”
鉴于每个请求都会从此列表中删除一个项目,为什么不仅通知用户已删除哪个项目,而不是一次又一次地发送整个列表?如果此列表具有任何重要大小,此微小更改将产生巨大改进。

我会看一下Boost,谢谢。旧版本的问题在于我无法理解push,所以我使用了轮询,这导致Apache被请求淹没。 - neuropie
此外,您会建议为每个客户端使用一个线程循环,还是为所有客户端使用一个线程循环? - neuropie
我建议使用单线程循环,因为这样你就不必担心多线程服务器带来的大量同步问题。只有当一个客户端的请求足以阻塞我的线程,从而对其他客户端的需求产生不利影响时,我才会切换到多线程服务器。根据你的描述,这种情况并不适用。 - DeusAduro

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