我正在制作一个多人游戏。现在我正在尝试选择将Android设备连接到服务器的技术。客户在Android上运行,游戏是MMORPG。我想在Java中编写服务器。现在我只有3个想法:

1)使用普通的Java和套接字创建多线程环境。通过这种方式,在游戏客户端和服务器之间执行全双工连接将更容易。但我有以下顾虑:

1.1)游戏是具有大量对象的MMORPG,如果有于例如5000人同时播放,我不确定这些解决方案如何缩放。我将能够在Java Machine上运行多少个线程?我怎样才能大致计算?如果1个线程为每个插座读取,并且1个线程是写入插座(如1播放器的2个线程)。

1.2)当玩家的数量增长时,我将如何能够扩展我的自我写入的jar-instrive来分发多个服务器?也许有一些特殊的诀窍来做到这一点?

1.3)很多编程开销 - 套接字API是相当低的。

2)创建用于服务HTTP请求的servlet接口。

2.1)只要每个玩家都有他/她自己的会话,易于控制会话(和授权)。

2.2)可以连接到Java EE EJB或其他 - 系统级编程的许多并发症被带走。所以我可以专注于写作业务逻辑。

2.3)可以为所有类型的客户提供HTTP - 移动设备+浏览器。

2.4)高速 - 甚至1个婴儿车容器每秒可以提供几千个请求,因此它将非常快。

2.4)但这种方法不能提供全双工通信。我必须每1秒发送请求以检查更新。 1秒延迟不会对游戏产生大量差异,因为它是基于转向的,但它仍然会产生大量流量。在有许多玩家玩的时候是可行的吗?我听说过一些彗星技术,但似乎如果服务器必须在行中推出许多消息,我仍然必须每次发送请求+这项技术尚未建立。

3)创建套接字并通过JMS将它们连接到JAVA EE服务器。

3.1)冷却,因为允许客户端和服务器之间的全双工通信+提供Java EE的所有酷功能。稍后可以通过servlet接口扩展到浏览器。

3.2)看起来像某种过度内疚。这真的是人们如何做到的?我的意思是它甚至是正确的方式吗?任何理智的开发人员都会这样做吗?

我希望你能帮助我选择。我没有多大的经历做一些这样的工作。并希望坚持最佳实践。

有帮助吗?

解决方案

为什么重写你可以摆脱货架的东西?

为什么不使用 reddwarf server (以前是 project darkstar )?

Reddwarf Server是一个开源中间件解决方案,用于开发大型多人游戏的服务器端。它是Project Darkstar的官方社区叉,由Sun Microsystems支持和管理的开源项目。 - reddwarf的维基百科文章

reddwarf的域名似乎今天(2013-06-12)似乎是一个 wiki ,他们是迁移到 github repo

Reddward将其哲学和目标呈现为:

  • 使服务器端游戏代码可靠,可扩展,持久性和容错和容错,以对游戏开发人员透明的方式。
  • 向开发人员呈现一个简单的单线程事件驱动编程模型。由于代码处理不同事件之间的交互,开发人员永远不会使他或她的代码失败。 (来自 reddwarf教程

并不意味着服务器代码是单线程的,但它是从游戏开发人员的角度抽象的。 reddwarf教程提供了有关Reddwarf CAN的更多信息做并澄清其许多设计决策。

然而,

对您的一个关注点是我最后一次检查的多节点功能没有完全实现(CA.1111)。

从划痕

如果您重视学习经验,那么不应该阻止您尝试从头开始做大部分这些东西。但是,这是一项重大努力,并且会在您的问题中指出的是,在您的问题中指出,技术堆栈中的一些问题是对处理的,并将大大增加代码的复杂性'LL必须维持。

但无论如何,关于你的3个选项,如果您要为自制实施,那么您的第一个似乎是最好的。选项2(使用HTTP Servlet)似乎仅适用于某些游戏,尽管我猜它可能是一个相对不太体现的替代方案,在仍在委托到中间件时,您可以从许多Web服务器中受益,以处理负载(缓存模块等......)。选项3(使用JMS + JEE)确实似乎悬而未决,但很难确定,而不知道您所考虑的内容。

如果你在这里尝试学习,那么显然选择1将覆盖很多地面。但它将成为一个相当艰难的战斗。

其他提示

1.1) you can't think in term of one Thread by user. Depending of machine configuration but you could load thousands of threads but it will not scale and lose a lot of time in Thread context switch. Better think NIO Netty like framework with few incoming and outcoming Thread pool executor that perform incoming messages under milli second execution.

1.2) You can simply scale by putting in front of you game server a loadbalancer component that can forward incoming player to right server according their load

1.3) NIO can handle thousands to to millions connection on a single box. Don't worry with this.

2.1) Manage your player sessions and 2.2) be away of EJB architecture. It will eat all your box power instead of allocating power to your game which is your goal.

2.3) HTTP can serve all clients but if you run realtime game i encourage to use binary socket and keep HTTP only for loadbalancing , login , stats and fallback when can't establish a socket connection.

2.4) Socket based server can handle hundred thousands incoming message per second. This is the property of low latency system

While it's very interesting to dive in building such system. What is your goal? Learn to build such system or succeed your game?

Many java multiplayer game server technology framework already exist. SmartFox Server, ElectroTank...

We have our own java high load Nuggeta multiplayer crossplatform java game server that addresses all points discussed above and much more. If you wanna try it it's free.

If your goal is to write a game server it's awesome venture that can takes long time but very exciting. If your goal is to succeed your game. Pick up among Java game server SDK already existing.

许可以下: CC-BY-SA归因
scroll top