您的位置 首页 java

深度解析Java游戏服务器开发

1.认识游戏

1.1什么是游戏

1.1.1游戏的定义

任何人类正常生理需求之外的活动均可称为游戏

1.1.2游戏的分类

RPG角色扮演游戏、ACT动作游戏、AVG冒险游戏、FPS第一人称视角射击游戏、TPS第三人称视角射击游戏、FTG格斗游戏、SPT体育游戏、RAC竞速游戏、RTS即时战略游戏、STG射击类游戏、SLG策略游戏、MSC音乐游戏、SIM生活模拟游戏、TCG育成游戏、CAG卡片游戏、LVG恋爱游戏、GAL美少女游戏、WAG手机游戏、MMOPRG大型多人在线角色扮演游戏、ARPG动作角色扮演游戏、ETC其他类游戏、动漫游戏、MOBA多人在线技术竞技游戏

1.2游戏开发及分工

可行性与计划研究阶段、分析需求阶段、设计阶段、开发阶段、测试阶段、系统验收

开发流程:产品立项、游戏设计、开发阶段、测试阶段、Alpha测试(项目组内部测试)、Beta测试(游戏内测)、上线推广阶段、运营阶段

1.3游戏行业现状分析

虚拟现实设备及内容、移动游戏操控设备、互联网+游戏创业、电竞直播平台、原创IP、H5游戏

1.4游戏服务器开发要点

网络知识(OSI参考模型、套接字、长连接、短连接)、并发编程、设计模式(单例模式、工厂模式、观察者模式)、数据库(MySQL、Mongo,内存数据库 Redis 、Memcache、Ehcache)、gm运营工具、运维知识(服务器部署、架构搭建、负载均衡、日志管理、数据库备份恢复、灾难处理)

2.环境搭建

2.1Windows开发环境搭建

2.1.1安装JDK

设置Path变量、设置CLASSPATH环境变量、设置JAVA_HOME

2.1.2安装Eclipse

2.1.3安装数据库客户端工具

Navicat for MySQL (MySQL) : http: //www.navicat.eom.cn/

MongoVUE (Mongo ) : http:/ www.mongovue.com

RedisClient (Redis) : https: // github.com/caoxin /RedisClient

2.1.4安装SSH工具

XShell: http: //www.netsarang.com/products/xsh_overview.html

SSH: ~·jaffem/tutoriaVSSH _secure_ shell_ client.htm

2.1.5 安装其他工具

文本编辑器

Ediψlus: https: //www.ediφlus.com/download.htrnl

Sublime Text: http: //www.sublimetext.com/

容器

Tomcat: https: //tomcat.apache.org/

JBoss :

JSON 解析工具

在线 JSON 解析:

2.2Mac OS X开发环境搭建

2.3Linux服务器环境搭建

3.网络通信

3.1 通信协议

TCP/IP模型:链路层、 网络层 、传输层、应用层

3.1.1面向连接的 TCP

3次握手建立连接

面向连接:通信之前必须通过三次“握手”建立可靠连接

安全可靠:每 次通信都必须得到对方的应答,否则认为数据报丢失,需要重发。

全双工通信: 旦建立连接,双方都可以通过通道进行数据传输

通信只能建立在两个点之间

面向流通信:通信传输是通过流的形式进行的。

3.1.2面向数据报的UDP

3.1.3HTTP编程

3.1.4Socket编程

服务器监听、客户端请求、连接确认

3.1.5 WebSocket 编程

3.2 Java NIO 基础

3.2.1BIO编程(阻塞式IO)

3.2.2NIO编程(非阻塞式IO)

创建1个 线程 负责处理 IO 事件和 事件的分发。

事件驱动机制非同步监视事件,而是事件到达之后触发。

线程之间通过 wait notify 等方式通信,减少了不必要的线程切换。

3.2.3AIO编程(异步IO)

没有阻塞等待客户端连接

3.3Mina的介绍及其使用

3.3.1总体架构

3.3.2IoService

负责IO相关工作

3.3.3IoFilterChain

扩展处理器

3.3.4IoHandler

业务逻辑处理

3.3.5IoSession

对应客户端与服务端的IO连接

3.3.6工作原理

3.3.7Acceptor与Connector 线程

监听连接

3.3.8 Processor 线程

复制IO读写操作

3.3.9线程模式

3.3.10请求的处理顺序

保证请求IO请求顺序

3.3.11Mina编程

3.4 Netty 的介绍及其使用

3.4.1总体架构

3.4.2零拷贝

Netty 的接收和发送来用 ByteBuffer, ByteBuffer 采用 Direct Buffers ,即ByteBuffer 直接使用堆外的内存进行 Socket 读写,而不需要进行字节缓冲区的二次拷贝

Netty 的组合 Buffer 对象,能聚合多个 ByteBuffer 对象,用户如果要操作多个Buffer ,可以先将这些 Buffer 组合,然后操作这个组合 Buffer

Netty 采用 transferTo 进行文件传输,可以直接把文件缓冲区的数据发送到目标的Channel

3.4.3 Codec 框架

FrameDecoder

FrameDecoder 通过维护 DynamicChannelBuffer 存储接收的数据,它提供抽象模板,在模板中写好了整个解码过程,使用它只需在子类实现 decode 方法。

ReplayingDecoder

ReplayingDecoder FrameDecoder 的非阻塞解码

ObjectEncoder和Objectoecoder

这两个类能对 Java 对象进行编解码序列化。

HttpRequestEncoder 和HttpRequestDecoder

Netty中还能实现 HTTP 服务器,通过 HttpRequestEncoder HtφRequestDecoder能实现 HTTP 请求和响应的编解码。

3.4.4 Channel

3.4.5 ChannelEvent

3.4.6 ChannelPipeline

3.4.7 Netty 编程

4.数据交互

4.1数据传输格式

网络数据大小、网络数据安全性、实现复杂度、协议通用性

数据类型:自定义二进制 Binary、开源协议、文博会协议

4.2JSON的使用及解析

4.3XML的使用及解析

4.4Google Protocol Buffer 的介绍及使用

4.4.1 Protobuffer 的安装与编译

4.4.2 Protobuffer 的语法

标识符,Proto buffer 协议的标识符为 message enum, message 代表消息类型, enum 代表枚举类型,在通过 Protobuffer 的编译器编译之后,它们都生成 Java 中的一个类。

修饰符

required :该宇段不能为空,必须传递值,否则 message 不能被正确初始化。

optional :该字段可以为空,不管该字段是否传值, message 都能正确初始化。

repeated :重复的字段,等同动态数组,编译成 Java 后即为 List ,但是其数据可以为空。

数据类型

Package

Option,Option 可以定义 些常用选工页

4.4.3 生成 Java类

4.4.4 Eclipse的protobuf-dt 插件

4.4.5 示例程序

5.数据缓存与 持久化

5.1游戏数据存储

5.1.1 数据分类

全局数据(排行榜信息、联盟信息、国家信息、竞技场信息等全服所有玩家共享的信息)、在线玩家数据、离线玩家数据

5.1.2 数据缓存方式

5.1.3 数据持久化方式

5.1.4 数据库的比较

5.2MySql的介绍及使用

5.3MongoDB的介绍及使用

文档存储、可扩展性、易查询、安全性

5.4Memcache的介绍和使用

5.5Redis的介绍和使用

5.5.1Redis的特点

速度快、数据类型丰富、操作原子性、持久化、应用场景丰富

5.5.3Redis的持久化

AOF 模式指 Redis 在执行过程中会把所有的写指令记录下来,当数据恢复时,再按照当时记录的顺序执行 遍命令

RDB 模式是在不同的时间 点将 Red is 存储的数据快照存储到磁盘等介质上, Redis在持久化过程中,会先将数据写到临时文件中,持久化过程结束之后再用临时文件替换上次持久化好的文件

5.5.4Redis的主从复制

6.游戏逻辑

6.1逻辑架构

6.1.1项目目录

6.1.2模块介绍

core :核心模块

Gamelnit :游戏服务器启动关闭类,负责服务器资源的加载与释放

Router :处理玩家请求接入的逻辑处理消息分发

manager:逻辑模块

event 事件处理模块。

module :逻辑模块。

net :网络模块,使用的网络框架及网络请求处理等

rpc :负责逻辑服务器与其他服务器的远程服务调用。

NetFramework :模拟网络层框架,负责网络请求响应的封装(这里只写了一个模拟类,正式开发中应当使用 Netty Mina 等网络框架〉

NetHandler :模拟网络框架处理接口,负责处理网络框架的逻辑。

NetHandlerlmpl :模拟网络框架处理接口的实现类

NetModule :模拟网络层框架封装,负责封装网络框架。

ProtoIds :网络请求协议号,客户端与服务器交互的协议号

ProtoMessage :网络请求消息体,客户端与服务器交互的消息结构

ResultCode :网络响应码,客户端与服务器交互返回结构的响应码封装

net.properties :网络配置 IP 端口文件

task :任务模块,游戏中需要的定时任务。

JobMgr: Job 管理类

QuartzManager: Quartz 管理类

TestJob :测试 Job类

template :静态数据,游戏中静态数据的载入和读取。

DataLoader :游戏服务器数据载入类。

util :工具类,所需要的工具类,如数据库工具类、缓存工具类、线程池工具

CacheUtil 缓存管理类

DB 数据库管理类

ExecutorPool 线程池管理类

test:游戏服务器逻辑框架测试类

6.2逻辑流程

6.2.1网络模块

6.2.2线程池

6.2.3启动服务器

6.2.4逻辑请求处理

6.2.5关闭服务器

6.3事件处理器

在游戏服务器中,经常会有事件触发机制,触发的事件通常是通过异步方式执行。服务器内部事件处理器,用于断开模块之间藕合。比如登录后要给好友发上线通知 登录完成后触发一个登录事件,所有关注这个事件的模块,仍然处理自己的业务 避免 登录完成后直接调用其他模块的接口。

6.4定时任务

在游戏服务器中,经常会有定时执行某个逻辑的需求,如每日签到、整点更新、玩 家某个属性在某个时刻进行刷新、联盟或国家的声望值在每周的某个时刻刷新,这一系 列的需求都需要使用定时任务来实现

6.5RPC框架

各个服务器进程之间的通信部分,在多个服务器进程之间的通信,目前使用的技术 般是 RPC

6.5.1 Json-rpc

6.5.2 Motan

发现服务、订阅服务和服务通知

支持 Fail Over FailFast ,以及 Server 连续失败的次数达到规定次数进行心跳检 测等高可用策略

支持优先低并发、 致性 Hash 、随机请求、轮询 负载均衡策略

支持 SPI 扩展

可调用统计日志和访问日志

7.游戏安全

7.1游戏安全的必要性

7.2登录安全

7.3游戏充值

客户端向开发商服务器请求生成订单。

客户端调用联运 SDK 打开支付界面,玩家输入支付信息。

联运 SDK 将订单信息发送给联运服务器。

联运服务器记录订单并发送订单给开发商服务器进行支付验证。

开发商服务器校验订单信息,校验成功就对客户端发货,并返回校验结果给 联运服务器。

联运服务器返回订单结果给客户端。

7.4SQL 注入

7.5通信协议与消息格式

7.6整型溢出

7.7并发请求

7.8逻辑漏洞

7.9日志系统

8.服务器架构分析

8.1服务器架构的演变过程

8.2全区同服架构分析

8.2.1 coc 架构模型分析

8.2.2 COK 架构模型分析

8.3分区分服架构分析

8.4弱联网类游戏架构分析

8.5MMORPG 类游戏架构分析

9.《 皇室战争 》游戏开发实战

9.1微竞技游戏介绍

9.2架构分析及搭建

9.2.1 功能分析

9.2.2 服务器部署架构

9.2.3 系统架构

.通信机制、数据处理、项目管理、系统技术架构图

9.3数据持久化方案

9.3.1 数据结构分析

9.3.2 使用 Morphia 操作 MongoDB

9.4Netty 网络框架的使用

9.4.1 Netty 实现的 HTTP 服务器

9.4.2 Netty 实现的 TCP 服务器

9.5账号系统

9.6个人信息

9.7英雄卡牌系统

9.8宝箱系统

9.9战斗系统

9.10客户端模拟

10.游戏开发技术前景

10.1Egret

10.2Cocos 20

10.3Unity

10.4Unreal

10.5Java

10.6Node.js

文章来源:智云一二三科技

文章标题:深度解析Java游戏服务器开发

文章地址:https://www.zhihuclub.com/199505.shtml

关于作者: 智云科技

热门文章

网站地图