如何用JAVA开发游戏服务器?

如何用JAVA开发游戏服务器?,第1张

首先,我得说明的是,目前市场上新人很难去做pc游戏开发,要么是做页游要么是手游。

页游不清楚我就不说了,手游里面,客户端主要就是c2d和u3d。

如果你想做客户端,那么你可以转学u3d,因为它使用的语言是csharp,这个语言和java相似。网上unity的教程也很多,你随便找一下就有了。

再说说手游服务器,其实我入行服务器还是挺巧合的,当初本来是打算做客户端的,都入职了,因为招不到服务器,就让我转服务器了。。

服务器的教程,我至今也没找到,而且也找不到系统的教程。

开源的服务器框架也只熟悉kbengine和scut。其中一个是cpp做底层python做开发的,一个是csharp做开发。而且scut已经两年没有更新了,应该是死掉了。

所以,想要学服务器开发,得碰点运气。

java服务器目前主流框架技术有网络层netty或mina,数据协议protobuf,数据库mysql,缓存数据库redis,jdbc一般是mybaits或者jpa,项目管理maven,设计层面spring

然后还需要熟悉多线程,linux的基本 *** 作,git或者svn。

差不多了,这些都有个大致的了解,会用,应该就能找到工作了。

后面再深入需要学习的也挺多的,到时候你再根据业务需求自己琢磨着学吧。

因为阿里云服务器事先就安装好了ssh,我们可以用xshell连上去,我把下载好的targz上传到/opt/目录,用命令 tar -zxvf jdk-8u74-linux-x64targz
剩下的就是配置环境变量了。
然后我就在命令行输入 #java -version 发现并没有出现java的版本信息(有些好像不用安装好没配置环境变量就能出来,我这里好像不行)
于是我开始配置环境变量vi /etc/profile 加入如下配置

JAVA_HOME=/opt/jdk180_74
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=:$JAVA_HOME/lib/dtjar:$JAVA_HOME/lib/toolsjar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
然后是配置文件立即生效:[root@localhost ~]# source /etc/profile //使修改立即生效
再输入java -version就有你安装的版本信息了

一、需要解决中央控制端到各节点服务器之间的通信。
这个其实牵扯到一个通信协议的问题,各语言都有自己的socket,thread的库,直接调用即可。但是这个通信协议就需要自己来完成了。既不能太简单,太简单了,明码传输,如果别人获知了这个接口,就很容易执行一些令人讨厌的 *** 作。也不能太复杂,太复杂了等于是给自己找麻烦,所以简单的数据包编解码的工作或者用token验证的方式是需要的。通信协议起码要两种,一种是传输命令执行的协议,一种是传输文件的协议。
二、跨语言的socket通信
为什么要跨语言,主控端和代理端通信,用什么语言开发其实无所谓。但是为了给自己省事,尽可能使用服务器上已经有了的默认语言,Ambari前期采用php+puppet的方式管理集群,这不是不可以,puppet自己解决了socket通信协议和文件传输的问题,可你需要为了puppet在每台服务器上都安装ruby。我是个有点服务器和代码洁癖的人。光是为了一个puppet就装个ruby,我觉得心里特对不起服务器的资源。所以我自己写了一个python的代理端。python是不管哪个linux系统在安装的时候就都会有了。然后主控端的通信,可以用python实现,也可以用php实现,但是考虑到对于更多的使用者来说,改php可能要比改tornado简单许多,所以就没用python开发。hadoop分支版本众多,发布出去,用户要自己修改成安装适合自己的hadoop发行版,就势必要改源码,会php的明显比会python的多。php里面的model封装了所有的 *** 作,而python只是个 *** 作代理人的角色而已。
所以也延伸出一个问题,什么语言用来做这种分布式管理系统的代理端比较合适,我自己觉得,也就是python比较合适了, *** 作系统自带,原生的package功能基本够用。用java和php也可以写agent,但是你势必在各节点预先就铺设好jre或者php运行环境。这就跟为什么用python和java写mapred的人最多是一样的。没人拦着你用nodejs写mapred,也可以写,就是你得在每个节点都装v8的解释引擎,不嫌麻烦完全可以这样干。原理参看map/reduce论文,不解释。perl也是 *** 作系统原生带的,但是perl的可维护性太差了,还是算了吧。
所以这就牵扯到一个跨语言的socket问题,理论上来说,这不存在什么问题。但这是理论上的,实际开发过程中确实存在问题,比如socket长连接,通信数据包在底层的封装方式不同。我没有使用xml-rpc的原因之一就是我听说php的xmlrpc跟其他语言的xmlrpc有不同的地方,需要修改才能用,我就没有用这种办法。最早是自己定义的 *** 作协议,这时就遇到了这些问题,所以后来直接采用了thrift方式。就基本不存在跨语言的socket通信问题了。
三、代理端执行结果的获取
无论命令还是文件是否在代理端执行成功,都需要获取到执行结果返回给中央端。所以这里也涉及一个读取节点上的stdout和stderr的问题。这个总体来说不是很难,都有现成的包。当然这个时候你需要的是阻塞执行,而不能搞异步回调。
还有个问题是,我要尽可能使用python默认就带的包,而尽量不让服务器去访问internet下载第三方的包。
还有代理端最重要的一点,就是python的版本兼容性。centos5用python 24,centos6用python 26,ubuntu基本默认都是27。所以一定要最大限度的保证语言的跨版本兼容性,要是每个 *** 作系统和每一个版本我都写一个代理,我一个人就累死了。

1如今的手游世界,如果没搞个跨服赛事,都不好意思说它是一个手游了。

说到跨服,就不得不说下匹配服了。比如一个跨服天梯赛事,需要满足不同服的玩家能够同屏PK。为了能够把实力接近的玩家作为对手,我们需要一个独立的匹配服来收集数据,然后进行房间分配。匹配服,也是跨服赛设计的基础。

典型的匹配服通信层我们可以采用p>

为了能区别游戏服和匹配服的消息类型,我们匹配服的消息,都加一个M(Match)前

4业务处理器

我们依然使用@Controller注解来标识一个模块处理器,使用@RequestMapper注解来标记业务处理方法。不同的是,在游戏服我们每个消息的元信息都带有一个模块号和子类型号。在匹配服,我们就不这里处理了。因为匹配服的业务比较少。我们直接用消息类的名称作为业务签名即可。

在业务分发器,我们保存每一个方法签名,与对应的方法处理器。

5匹配服在收到一个>

启动匹配服服务器(MatchStartupjava)

再执行游戏服的单元测试


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13460246.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-11
下一篇 2023-08-11

发表评论

登录后才能评论

评论列表(0条)

保存