有大神知道java游戏服务器端开发开发主要干什么吗

相关推荐职位
年薪面议 | 北京
年薪14-19万 | 北京
年薪18-30万 | 北京
年薪18-48万 | 北京
年薪10-24万 | 北京
3年以上经验
职位描述:
Responsibilities:1. 负责服务器端通讯系统、逻辑系统的设计及开发;2. 合理组织服务器端数据结构,并和客户端进行有效沟通 ;3. 设计,编码,测试,文档记录;4. 与设计人员配合,将设计开发成产品;5. 与项目经理配合,详细了解并实现需求;6. 与架构设计师配合,对模块进行设计和开发;7. 与测试人员配合,了解并解决产品中存在的问题。Required Skills:1. 熟练使用JAVA编程;2. 了解数据结构、算法、TCP/IP协议;3. 熟练掌握mysql开发;4. 熟悉Linux操作系统 eclips开发工具;
其他信息:
汇报对象:技术总监
下属人数:0人
所属行业:
所属部门:技术部
企业性质:私营·民营企业
企业规模:500-999人
专业要求:不限
薪酬福利:
职位年薪:18-30万
薪资构成:基本薪资
年假福利:国家标准
社保福利:国家标准
居住福利:公积金
通讯交通:不确定
企业介绍:
国内知名的社交游戏公司,成立于2009年初。总部在中国北京,在日本东京等地设有分公司和办事处。成功运营Facebook、mixi、腾讯、人人15个社交平台。
猎聘温馨提示:
如在投递及面试过程中遇到招聘方的任何收费行为( 如培训费、 体检费、 资料费、 置装费、 押金等),则存在诈骗风险,请您务必提高警惕。
可能感兴趣的职位:
本科及以上 | 3年工作经验
互联网/移动互联网/电子商务
大专及以上 | 2年工作经验
基金/证券/期货/投资
本科及以上 | 5年工作经验
电子技术/半导体/集成电路
统招本科 | 5年工作经验
互联网/移动互联网/电子商务
大专及以上 | 3年工作经验
统招本科 | 3年工作经验
电子技术/半导体/集成电路
本科及以上 | 3年工作经验
互联网/移动互联网/电子商务
本科及以上 | 5年工作经验
互联网/移动互联网/电子商务
统招本科 | 5年工作经验
电子技术/半导体/集成电路
统招本科 | 3年工作经验
互联网/移动互联网/电子商务
统招本科 | 5年工作经验
互联网/移动互联网/电子商务
统招本科 | 2年工作经验
互联网/移动互联网/电子商务
学历不限 | 3年工作经验
能源(电力/水利),石油/石化/化工,环保
统招本科 | 2年工作经验
互联网/移动互联网/电子商务
本科及以上 | 4年工作经验
计算机软件
本科及以上 | 5年工作经验
互联网/移动互联网/电子商务
本科及以上 | 5年工作经验
互联网/移动互联网/电子商务
统招本科 | 5年工作经验
本科及以上 | 5年工作经验
互联网/移动互联网/电子商务
大专及以上 | 3年工作经验
互联网/移动互联网/电子商务
统招本科 | 3年工作经验
互联网/移动互联网/电子商务
统招本科 | 3年工作经验
互联网/移动互联网/电子商务
统招本科 | 5年工作经验
计算机软件
大专及以上 | 经验不限
大专及以上 | 经验不限
大专及以上 | 经验不限
大专及以上 | 经验不限
大专及以上 | 经验不限
本科及以上 | 3年工作经验
互联网/移动互联网/电子商务
大专及以上 | 3年工作经验
互联网/移动互联网/电子商务,计算机软件
职位发布者
王晓蕾/猎头顾问
北京鼎力聚和管理咨询有限公司
ID:LT1262713
应聘查看率
AAMA亚杰商会
北京东宝生物技术有限公司
北京锦之虹航空服务有限公司
北京众芯信义投资管理有限公司
北京斯宝特商贸有限公司
微信订阅职位
扫描二维码订阅高薪职位或在微信公众账号中搜索“猎聘网”选择栏目:
分享自:失足程序员 |
永远的学童
老司机说说:我是如何用java设计游戏服务器架构的
本文《老司机说说:我是如何用java设计游戏服务器架构的》提供学童君学习参考,知识和精力有限,无法一一勘误,若有所错误,可以在文末“反馈”按钮提出反馈。学童网()尽量提供给您准确有价值的信息。
浏览《老司机说说:我是如何用java设计游戏服务器架构的》小提示:
文章若附带资源/案例下载、效果/视频/动画演示,一般在文章底部资源列表里有提供
文章清晰的要点多数有加粗提示,多留意
涉及到代码地方,有清晰的代码样式。
文章内蓝色字体,多是本文的相关链接。
好文可以收藏到您个人的会员中心
要查阅跟本文相关的大量信息,可以访问专属栏目《》
&现在游戏市场分为,pc端,移动端,浏览器端,而已移动端和浏览器端最为接近。都是短平快的特殊模式,不断的开服,合服,换皮。如此滚雪球!
那么在游戏服务器架构的设计方面肯定是以简单,快捷,节约成本来设计的。
来我们看一张图:
这个呢是我了解到,并且在使用的方式,而PC端的游戏服务器而言,往往是大量的数据处理和大量的人在线,一般地图也是无缝地图的完整世界观,所以不同的程序都是独立的进程并且在不同的server中运行!
而浏览器端和移动终端,在上面就说过了,它主要是不断的开服,合服,开服,合服,那么势必一个服务器承载量和游戏设计就不符合pc段游戏的设计。而且移动终端由于存在着千差万别的设备配置情况,也不可能
用无缝地图,手机承受不了。美术开销也是巨大的。为了承载着这样短平快,并且还要承载一台物理的server,开启几个游戏服务器进程方式;所以早就了移动终端游戏服务器不一样的架构;
移动终端游戏服务器我的设计
我在设计的时候,以登录服务器为中心,设计,客户端先请求登录服务器,登录后拿到一个token值然后请求服务器列表,选择服务器,进行二次登录,二次登录就只需要token值了;
最早以前toeken是需要传回数据中心进行验证,而现在的设计是other2.0的设计模式,通过md5验证即可。实现了一个解耦操作;
登录服务器,数据中心和充值服务器,都是单独的server,物理机,而游戏服务器gamesr,就可能是g1,g2一组,g3,g4一组,这是部署的程序架构;
那么程序的搭建架构呢?
每一个服务器程序会有对应的脚本程序进行控制;
逻辑服务器架构设计
来看个图片先!
通过socket nio 进行数据传输,当数据进入游戏服务器以后,会按照先后顺序进入队列,然后由消息分发器线程,把对应的消息分排的对应的线程进行处理;
比如玩家登陆发配到登录线程(我这里所说的线程也许不止一个线程,也可能是一个组),然后登录成功,把玩家放到对应的地图,,存储对应的关系。
当玩家正常游戏消息来了以后会消息分发器会根据玩家对应关系获得对应的地图线程,分发消息到对应的地图线程处理!这样好处就是,分散开来多个线程处理玩家操作数据
划分地图线程,保证在一个地图上线程操作是安全性的。这里特别注明:由于地图是切割后的小地图,跨地图是需要传送门传送,所以一个地图玩家和怪物的数量不会太多,一个线程就能处理过来!
地图线程存在了对应的定时触发器:
PlayerAI (pai) 玩家智能
MonsterAI (mai) &怪物智能
PlayerRun (prun) 玩家移动模拟
Monster (mrun)怪物移动模拟
BuferRun buff计算
FightRun 战斗计算
等等一系列的操作在一起!
消息处理器设计
脚本项目里面会存在两个根目录,一个是消息处理器handler;
另外一个根目录才是脚本scripts;
为什么我要把消息处理器handler放在脚本里面呢?
好处就是我不能保证每一个开发人员在收到客户端传过来的消息的逻辑处理都是正确的;逻辑是非常严谨的
如果没有放在脚本里面,上线了发现消息处理逻辑有bug,那么这个时候处理就非常麻烦;
package net.sz.game.proto.handler.
import net.sz.engine.io.nettys.tcp.NettyTcpH
import net.sz.engine.script.IInitBaseS
import com.game.proto.CrossM
import net.sz.game.gamesr.server.tcp.GameTcpS
import org.apache.log4j.L
* author 失足程序员&br&
* mail &br&
* phone &br&
public final class ReqCrossCreateTeamZoneHandler extends NettyTcpHandler implements IInitBaseScript {
private static final Logger log = Logger.getLogger(ReqCrossCreateTeamZoneHandler.class);
public void init() {
net.sz.engine.io.nettys.NettyPool.getInstance().register(
com.game.proto.CrossMessage.Protos_Cross.CrossCreateTeamZone_VALUE,//消息消息id
com.game.proto.CrossMessage.ReqCrossCreateTeamZoneMessage.class,//messageClass 协议请求消息类型
this.getClass(), //消息执行的handler
GameTcpServer.TEAMTHREADEXECUTOR,//处理线程
com.game.proto.CrossMessage.ReqCrossCreateTeamZoneMessage.newBuilder(),//消息体
0 // mapThreadQueue 协议请求地图服务器中的具体线程,默认情况下,每个地图服务器都有切只有一个Main线程.
//一般情况下玩家在地图的请求,都是Main线程处理的,然而某些地图,可能会使用多个线程来处理大模块的功能.
public ReqCrossCreateTeamZoneHandler() {
public void run() {
// TODO 处理CrossMessage.ReqCrossCreateTeamZone消息
CrossMessage.ReqCrossCreateTeamZoneMessage reqMessage = (CrossMessage.ReqCrossCreateTeamZoneMessage) getMessage();
//CrossMessage.ResCrossCreateTeamZoneMessage.Builder builder4Res = CrossMessage.ResCrossCreateTeamZoneMessage.newBuilder();
这就是一个消息处理模板;
脚本在被加载的时候会调用init函数,init函数把消息处理连同消息本身一起注册到消息中心,包含消息id,消息处理handler,消息处理应用的消息模板,已经消息的处理线程;
NettyPool.getInstance().setSessionAttr(ctx, NettyPool.SessionLastTime, System.currentTimeMillis());
MessageHandler _msghandler = NettyPool.getInstance().getHandlerMap().get(msg.getMsgid());
if (_msghandler == null) {
log.error("尚未注册消息:" + msg.getMsgid());
NettyTcpHandler newInstance = (NettyTcpHandler) _msghandler.getHandler().newInstance();
Message.Builder parseFrom = _msghandler.getMessage().clone().mergeFrom(msg.getMsgbuffer());
newInstance.setSession(ctx);
newInstance.setMessage(parseFrom.build());
if (_msghandler.getThreadId() == 0) {
log.error("注册消息:" + msg.getMsgid() + ",未注册线程,线程id:0");
log.debug("收到消息并派发:" + msg.getMsgid() + " 线程id:" + _msghandler.getThreadId());
ThreadPool.addTask(_msghandler.getThreadId(), newInstance);
} catch (InstantiationException | IllegalAccessException | InvalidProtocolBufferException e) {
log.error("工人&“" + Thread.currentThread().getName() + "”& 执行任务&" + msg.getMsgid() + "(“" + _msghandler.getMessage().getClass().getName() + "”)& 遇到错误: ", e);
而消息中心收到消息以后会自动解析消息,转发消息到对应的消息handler逻辑块
这样就形成了一个消息循环;
提到消息,就不得不说消息编码器和解码器
package net.sz.engine.io.nettys.
import io.netty.buffer.ByteB
import io.netty.buffer.U
import io.netty.channel.ChannelHandlerC
import io.netty.handler.codec.ByteToMessageD
import io.netty.util.ReferenceCountU
import java.util.ArrayL
import java.util.L
import net.sz.engine.io.nettys.NettyP
import org.apache.log4j.L
* author 失足程序员&br&
* mail &br&
* phone &br&
class NettyDecoder extends ByteToMessageDecoder {
private static final Logger logger = Logger.getLogger(NettyDecoder.class);
private byte ZreoByteCount = 0;
private ByteB
private long secondTime = 0;
private int reveCount = 0;
public NettyDecoder() {
ByteBuf bytesAction(ByteBuf inputBuf) {
ByteBuf bufferLen = Unpooled.buffer();
if (bytes != null) {
bufferLen.writeBytes(bytes);
bufferLen.writeBytes(inputBuf);
return bufferL
* 留存无法读取的byte等待下一次接受的数据包
* @param bs 数据包
* @param startI 起始位置
* @param lenI 结束位置
void bytesAction(ByteBuf intputBuf, int startI) {
bytes = Unpooled.buffer();
bytes.writeBytes(intputBuf);
protected void decode(ChannelHandlerContext chc, ByteBuf inputBuf, List&Object& outputMessage) {
if (inputBuf.readableBytes() & 0) {
ZreoByteCount = 0;
//重新组装字节数组
ByteBuf buffercontent = bytesAction(inputBuf);
List&NettyMessageBean& megsList = new ArrayList&&(0);
for (;;) {
//读取 消息长度(short)和消息ID(int) 需要 8 个字节
if (buffercontent.readableBytes() &= 8) {
//读取消息长度
int len = buffercontent.readInt();
if (buffercontent.readableBytes() &= len) {
int messageid = buffercontent.readInt();///读取消息ID
ByteBuf buf = buffercontent.readBytes(len - 4);//读取可用字节数;
megsList.add(new NettyMessageBean(messageid, buf.array()));
//重新设置读取进度
buffercontent.readerIndex(buffercontent.readerIndex() - 4);
if (buffercontent.readableBytes() & 0) {
///缓存预留的字节
bytesAction(buffercontent, buffercontent.readerIndex());
NettyPool.getInstance().setSessionAttr(chc, NettyPool.SessionLastTime, System.currentTimeMillis());
if (!megsList.isEmpty()) {
if (System.currentTimeMillis() - secondTime & 1000L) {
reveCount += megsList.size();
secondTime = System.currentTimeMillis();
reveCount = 0;
if (reveCount & 50) {
logger.error("发送消息过于频繁");
chc.disconnect();
outputMessage.addAll(megsList);
ZreoByteCount++;
if (ZreoByteCount &= 3) {
//todo 空包处理 考虑连续三次空包,断开链接
logger.error("decode 空包处理 连续三次空包");
NettyPool.getInstance().closeSession(chc, "decode 空包处理 连续三次空包");
//释放内存资源
ReferenceCountUtil.release(inputBuf);
package net.sz.engine.io.nettys.
import com.google.protobuf.M
import io.netty.buffer.ByteB
import io.netty.buffer.U
import io.netty.channel.ChannelHandlerC
import io.netty.handler.codec.MessageToByteE
import java.nio.ByteO
import net.sz.engine.io.nettys.NettyP
import org.apache.log4j.L
* author 失足程序员&br&
* mail &br&
* phone &br&
class NettyEncoder extends MessageToByteEncoder&com.google.protobuf.Message& {
private static final Logger logger = Logger.getLogger(NettyEncoder.class);
ByteOrder endianOrder = ByteOrder.LITTLE_ENDIAN;
public NettyEncoder() {
protected void encode(ChannelHandlerContext chc, com.google.protobuf.Message build, ByteBuf out) throws Exception {
ByteBuf buffercontent = Unpooled.buffer();
com.google.protobuf.Descriptors.EnumValueDescriptor field = (com.google.protobuf.Descriptors.EnumValueDescriptor) build.getField(build.getDescriptorForType().findFieldByNumber(1));
int msgID = field.getNumber();
byte[] toByteArray = build.toByteArray();
buffercontent.writeInt(toByteArray.length + 4)
.writeInt(msgID)
.writeBytes(toByteArray);
logger.error("发送消息长度 " + (toByteArray.length + 4));
NettyPool.getInstance().setSessionAttr(chc, NettyPool.SessionLastTime, System.currentTimeMillis());
out.writeBytes(buffercontent);
这就是基本的游戏服务器架构设计,
这里同时提一下,之前文章里面又介绍消息解码器,
经过测试如果消息叠加,多包一起发送至服务器,服务器解析重组代码有问题,现在解码器是经过修正的
不知道各位看官有什么要指点小弟的。。作者博客:/ty408/
学童君~以上就是关于《老司机说说:我是如何用java设计游戏服务器架构的》的全部内容,更深入了解可以关注更多此方面的信息,学童网()给您提供此文的专有收藏链接,可以点击下方“收藏”按钮收藏佳文。
也可以选择如下操作:
获取和本文密切相关的大量同类型文章,可以访问《》栏目
关心跟此文相关大类栏目可以访问《》栏目,极大拓宽信息面。
如果有,文章相关的资源、代码包、视频、下载链接、演示效果可以在下方的资源列表里找到哦
知识点较多的文章可能会有上/下一页,上/下一篇,多留意。
当前观看编号:关闭
如果你要把《老司机说说:我是如何用java设计游戏服务器架构的》相关的资源地址通过手机访问,或者要把其中某段信息保存到手机,那么你可以把它复制到上面的框中,通过手机扫一扫就可以啦。
Copyright (C)
All rights reserved. our email[] - Collect from智联提示您:用人单位以任何名义向应聘者收取费用都属违法行为(如押金、资料费、代收体检费、代收淘宝信誉等),请提高警惕并注意保护个人信息!
您当前所在位置&&&当前页面
JAVA游戏服务器开发
五险一金绩效奖金交通补助餐补房补带薪年假补充医疗保险节日福利
职位月薪:元/月
工作地点:-浦东新区
发布日期:15天前
工作性质:全职
工作经验:1-3年
最低学历:不限
招聘人数:1人
职位类别:
岗位职责:1、负责游戏各功能模块的设计与开发;2、负责数据库的设计与开发;&任职要求:1、211学校学校毕业,工作年限不限;2、热爱编程,有大量的程序代码基础;3、热爱游戏,大量的游戏经验;4、熟悉C++或JAVA良好的数据结构基础;5、熟练掌握面向对象;6、良好的代码习惯及团队协作精神,谦虚好学,有创造力;7、熟悉mysql数据库及相关的操作;8、逻辑思维强,学习能力突出。&
工作地址:
上海市浦东新区张江高科技园区
欢迎优秀人才加盟!
最新职位推荐
今日相似推荐
地点:上海地点:上海地点:上海地点:上海地点:上海地点:上海地点:上海地点:上海地点:上海地点:上海
地点:上海地点:上海地点:上海地点:上海地点:上海地点:上海地点:上海地点:上海地点:上海地点:上海
公司规模:500-999人
公司性质:其它
公司行业:
公司主页:
公司地址:
浙江省杭州市西湖区西斗门路3号天堂软件园
热门职位推荐:匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 java游戏服务器开发 的文章

 

随机推荐