网站首页  英汉词典  古诗文  美食菜谱  电子书下载

请输入您要查询的图书:

 

书名 游戏服务器架构与优化/游戏开发与设计技术丛书
分类 计算机-软件工程
作者 蔡能
出版社 机械工业出版社
下载 抱歉,不提供下载,请购买正版图书。
简介
编辑推荐

蔡能著的《游戏服务器架构与优化》第一部分描写了Python网络编程和使用Python进行游戏服务器的编写,其中涉及Socket编程中的同步和异步操作,UDP和TCP,还涉及OpenSSL通信加密协议,让读者了解到如何在客户端和服务器端进行通信加密,此外,还特别指出了现在流行的H5游戏所对应的Websocket服务,以及Python的多线程框架。第二部分特别描写了数据库的存储,包括基础内容的数据存储和缓存的存储,第三部分着重分析了各种类型的游戏服务器以及历史渊源,在语言和服务器架构中做一个平衡,分析了各种类型的网络游戏所对应的服务器架构和设计。

内容推荐

《游戏服务器架构与优化》是—部从实操的角度讲解各种类型游戏和应用的服务器的架构、设计、开发和优化的著作。

作者蔡能是资深的游戏服务器技术专家和底层技术专家,有20余年开发和管理经验,曾在网易工作7年,参与过各种类型游戏的研发。

本书针对MMORPG、SLG、卡牌、3D虚拟社区等各种游戏,以及App、深度学习服务、商城等各种应用对应的服务器的研发和优化给出了具体的指导意见。从单机到集群,从基础的网络编程到分布式架构,由浅入深、前后呼应,整本书内容前后贯穿、逻辑缜密,对于开发和运维人员来说相当实用。

全书共12章,分为三个部分:

第—部分(第1~3章)网络和服务器

本书以Python为描述语言,所以首先详细讲解了Python中的网络编程模块,然后讲解了与服务器相关的通信加密、WebSocket、多线程等技术。

第二部分(第4~5章)存储和数据库

这部分首先讲解了数据库存储的基础知识,如内存数据同步、数据备份与恢复、SQLite等;然后重点介绍了高并发服务器的存储方案、高速缓存方案、二进制缓存方案、大规模计算方案,以及基于区块链技术的存储方案。

第三部分(第6~12章)服务器架构及其方案

第6章和第7章介绍了服务器的架构演变以及不同类型的游戏服务器各自是如何交互的;第8章和第9章详细讲解了游戏大厅和实时交互服务器的架构、开发和优化;第10章讲解了天梯和经济系统的开发与设计;第11章讲解了服务器的承载量以及客户端的优化方案;第12章介绍了与分布式服务器相关的技术。

目录

前言

第一部分 网络和服务器

 第1章 Python网络编程模块

1.1 Python Socket

1.1.1 Socket套接字

1.1.2 SOCK_STREAM、SOCK_DGRAM

1.1.3 阻塞和非阻塞模式

1.2 服务器端其他Socket方法

1.2.1 bind和listen

1.2.2 setsockopt

1.3 客户端Socket

1.4 通用的Socket方法

1.4.1 recv和send

1.4.2 recvfrom和sendto

1.5 SimpleHTTPServer和BaseHTTPServer

1.5.1 SimpleHTTPServer

1.5.2 BaseHTTPServer

1.6 urllib和urllib2

1.6.1 urllib.urlopen和urllib2.urlopen

1.6.2 urllib2中的GET和POST方法

1.7 事件驱动框架Twisted

1.7.1 Reactor模式

1.7.2 run、stop和callLater

1.7.3 Transports、Protocols、Protocol Factoies以及Deferred

 第2章 通信加密

2.1 软件、通信加密的几种常用方案

2.1.1 异或位运算加密

2.1.2 其他对称加密

2.1.3 非对称加密

2.2 OpenSSL

2.2.1 生成证书

2.2.2 公钥和私钥的配置

2.3 SSL/TLS通信

2.3.1 SSL/TLS连接

2.3.2 SSL/TLS HTTPS通信

2.4 其他加密方式

2.4.1 散列算法

2.4.2 BASE64

2.4.3 多国语言

 第3章 服务器实作

3.1 构建Python Websocket服务器

3.1.1 Websocket的应用场景

3.1.2 实作Websocket握手协议

3.1.3 MAGIC_STRING在Websocket中的作用

3.1.4 Websocket 启动

3.1.5 Websocket消息拆分和读取

3.2 多线程服务器

3.2.1 Python的多线程模式

3.2.2 锁

3.2.3 Python GIL

3.2.4 multiprocess的解决思路

3.2.5 给Websocket加上多线程

3.3 线程池

3.3.1 默认线程池和进程池

3.3.2 协程

3.3.3 第三方库

3.3.4 gevent的数据结构

第二部分 存储与数据库

 第4章 基础内容存储

4.1 数据库存储的种类

4.2 SQL与NoSQL

4.2.1 SQL

4.2.2 SQL语句语法

4.2.3 NoSQL

4.2.4 NoSQL语句语法

4.3 内存与IO读写速度

4.4 同步内存数据

4.4.1 Redis数据库的持久性

4.4.2 Redis主从数据库复制

4.5 数据备份和恢复

4.5.1 备份的类型

4.5.2 使用Python编写备份代码

4.6 不可或缺的SQLite

 第5章 存储方案

5.1 高并发服务器的存储方案

5.1.1 网站高并发服务器的策略

5.1.2 数据库的锁

5.2 高速缓存

5.2.1 Memcached

5.2.2 大文件缓存

5.2.3 分布式和集群

5.3 二进制存储方案

5.3.1 磁盘IO和缓存

5.3.2 图片和影音文件

5.4 大规模计算

5.4.1 图片服务器的架构

5.4.2 读取和写入文本

5.4.3 文本搜索方案

5.5 区块链技术

第三部分 服务器架构及其方案

 第6章 游戏服务器初探

6.1 服务器消息和轮询

6.1.1 卡牌游戏和弱连接

6.1.2 消息的轮询

6.2 游戏服务器架构演变

6.2.1 “上古时代”的游戏服务器

6.2.2 近代的网络游戏服务器

6.2.3 近现代经典游戏服务器模型

6.3 地图的无缝连接

6.3.1 无缝连接的分析

6.3.2 无缝地图更深层次的问题

 第7章 游戏服务器的交互

7.1 无状态和有状态的服务器设计方案

7.1.1 无状态的服务器设计方案

7.1.2 有状态的服务器设计方案

7.2 轮询

7.3 集群方案

7.3.1 集群的几种方式

7.3.2 集群的方案

7.3.3 数据库方案

7.3.4 Web服务和数据库

7.3.5 其他方案

7.4 定时任务

 第8章 游戏大厅

8.1 大厅登录流程

8.1.1 登录和选择游戏区

8.1.2 注册和登录

8.2 中间件

8.2.1 中间件的相关概念

8.2.2 ElasticSearch

8.2.3 在Python中使用ES

8.3 聊天服务

8.3.1 聊天服务器的搭建

8.3.2 聊天内容的获取和分发

8.4 大厅与游戏的对接

8.4.1 创建房间

8.4.2 与游戏的对接

 第9章 实时交互服务器

9.1 长连接和强交互

9.1.1 TCP连接

9.1.2 多线程

9.1.3 异步控制

9.1.4 加入队列

9.2 使用UDP的方案

9.2.1 什么是UDP协议

9.2.2 TCP协议和UDP协议的区别

9.2.3 使用Python编写UDP服务

9.2.4 加入多线程

9.3 协议包的设计和实现

9.3.1 协议包头和包身

9.3.2 协议包完整性

9.3.3 协议的加密和压缩

9.3.4 协议包混淆

9.4 断线重连

 第10章 天梯和经济系统

10.1 什么是天梯

10.1.1 天梯的框架

10.1.2 数据载入

10.2 天梯层级

10.3 经济系统

10.3.1 经济系统

10.3.1 经济系统简介

10.3.2 经济系统的设计

10.3.3 通货膨胀

10.4 预留接口和热更新

10.4.1 如何预留接口

10.4.2 代码热更新

 第11章 服务器承载量和客户端优化方案

11.1 心跳服务

11.1.1 应用层的心跳服务

11.1.2 心跳包协议

11.2 同步校验

11.2.1 服务器数据包同步

11.2.2 游戏世界的同步

11.3 服务器承载

11.3.1 Python的多线程并发

11.3.2 混合C/C++之一

11.3.3 混合C/C++之二

11.4 守护者进程

11.4.1 Windows下的守护者进程

11.4.2 监控和重启进程

11.5 客户端优化方案

11.5.1 优化解决方案

11.5.2 游戏引擎

 第12章 分布式服务器

12.1 什么是分布式系统

12.1.1 分布式文件系统

12.1.2 分布式服务

12.1.3 Python实现

12.2 流式处理

12.2.1 Storm

12.2.2 Spark

12.2.3 Samza

12.2.4 Flink

12.2.5 Trident

12.3 Pytlaon分布式框架

附录A 不同语言之间的区别

试读章节

9.2 使用UDP的方案

我们在上一节中着重说明了TCP编写服务器代码的方案,并且给出了代码的实例,读者对于服务器方案的实现有了一个明确和清晰的认识,在这一节中,我们将讲解UDP的方案。

我们在前面的基础章节的中描述了UDP的基本代码实现,以及UDP的接收和发送模式,在这里,我们将对IJDP编写的服务器代码进行实操,让读者对代码有一个更深层次的理解。

我们来看一下UDP的一些基础知识。

9.2.1 什么是UDP协议

对UDP协议的介绍如下:UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。

UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。

它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,常用的UDP端口号有DNS 53、TFTP 69和SNMP 161。

UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。

UDP报头由4个域组成,其中每个域各占用2个字节,具体包括源端口号、目标端口号、数据报长度、校验值。

UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据包通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用2个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。

数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。

UP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。

许多链路层协议都提供错误检查,包括流行的以太网协议,也许你想知道为什么UDP也要提供检查和校验。其原因是链路层以下的协议在源端和终端之间的某些通道可能不提供错误检测。虽然UDP提供有错误检测,但检测到错误时,UDP不做错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。

UDP Helper是实现对指定UDP端口广播报文的中继转发,即将指定UDP端口的广播报文转换为单播报文发送给指定的服务器,起到中继的作用。

为了在给定的主机上能识别多个目的地址,同时允许多个应用程序在同一台主机上工作并能独立地进行数据包的发送和接收,设计用户数据报协议UDP。

使用UDP协议包括TFTP、SNMP、NFS、DNS、BOOTP。

UDP使用底层的互联网协议来传送报文,同IP一样提供不可靠的无连接数据包传输服务。它不提供报文到达确认、排序,以及流量控制等功能。

每个UDP报文分UDP报头和UDP数据区两部分。报头由四个16位长(2字节)的字段组成,分别说明该报文的源端口、目的端口、报文长度以及校验值。

在TCP/IP协议层次模型中,UDP位于IP层之上。应用程序访问UDP层然后使用IP层传送数据报。IP层的报头指明了源主机和目的主机地址,而UDP层的报头指明了主机上的源端口和目的端口。

P210-212

序言

为什么要写这本书

在人们的观念中,游戏行业是一个既火爆又赚钱的行业,而游戏开发在非游戏开发人员的心里,则是比较神奇的存在。隔行如隔山,游戏究竟是如何开发的?游戏服务器究竟又是怎样工作的?

软件服务器后台开发人员对于游戏服务器的开发充满兴趣,而对于本身就是游戏开发者的人来说,对于更深层次的服务器逻辑,各种类型游戏服务器的区分和编写,各种平台的优化,都需要进行更进一步的了解。

作为游戏开发人员,H5 Game和Flash Game之间通信的差异在哪里?MMORPG的服务器究竟该怎么编写?:HTTPS通信和普通HTTPs协议有何区分?如何进行分布式编程?如何提高游戏服务器的高并发量?这些都是需要重点关心的问题。

不仅仅是游戏开发人员,作为普通后台开发人员,配置负载均衡,利用后台程序之间的相互通信进行负载,也是比较关心的问题。现今琳琅满目的开发包、开发工具,让这些事情变得事半功倍,在这样的情况下,如何利用现有的工具来进行配置,提高并发量,或者如何利用分布式计算来提高业务效率、工作效率,尽其所能地发挥工具的最大效率,也成为我们必须面对并解决的问题。

对于运维人员来说,面对的不仅仅是服务于程序员的各种后台配置,也需要集群配置、HTTPS,甚至各种类型数据库的配置。

针对以上提到的所有问题,本书会进行深入挖掘。

本书中99%,使用Python语言进行代码或者伪代码的编写和说明,为什么使用Python?这是因为虽然开发游戏服务器的语言多种多样,包括C/C++、Python、Node.JS等,但Python是目前上升热度最快,且用户呈直线增长的一种语言,其简洁的特性,就算是非专业程序员都可以很快掌握,学习成本不高,且能达到较为满意的产出。

从国内的情况来看,关于Python或游戏开发的书籍都很多,但是将两者合二为一进行讲解和说明的却并不多见。笔者在几十年的工作过程当中,经历了各种各样的项目,虽然大部分属于游戏行业,但其他行业也有涉及,比如视频类网站、人工智能、区块链等。在经历这些项目的过程中,我看到很多的团队和开发人员为了某一个项目和业务的功能进行各种细节上的取舍,或者各种没有经验一脚踩进大坑,这让我萌生编写本书的想法。我希望能尽一点微薄之力,将在游戏后台或其他后台开发过程中所经历的各种问题、优化方案及解决方案,进行一个提炼和汇总,如果能具体解决读者的各种问题,那就是本书之幸,本人之福。

读者对象

本书针对游戏服务器、应用服务器后台的优化、搭建以及应用进行讲解和介绍。为了照顾各个层面的读者,本书使用的语言是Python 2.7版本,书中并没有就Python基础规则和语法做详细介绍,因此要求读者具有基本的Python编程知识,比如Python库的导人、pip包安装工具的使用、调用库函数等基础语法知识。事实上,如果你专心花上几个小时的时间自学一下Python,就能具备Python的编程基础。

本书对读者的知识背景没有特定要求,如果你拥有了Python编程基础,看完本书应该对服务器端需要做什么、应该做什么、怎么做,有了然于胸的感觉。具体来说,本书适合以下几类读者阅读:

游戏服务器程序员。本书的核心命题就是游戏服务器的优化,其中涉及游戏服务器的基础、搭建;Socket知识、HTTPS基础;以及使用Python进行实作和优化。无论你是游戏后台开发人员还是客户端开发人员,都可以从书中获益。

应用服务器开发程序员。虽说游戏服务器程序员是重点,但是我们的核心议题仍然是服务器后台的开发,所以从这点来说,应用服务也是后台程序,本书在剖析游戏服务器后台编写和优化的同时,也涉及了分布式系统、集群,甚至Web服务器,或许在阅读本书后你会进发一些灵感。

运维工程师。事实上,只要是服务器开发,都会涉及运维的工作,而一个好的运维,必须而且一定会涉及各种脚本语言的开发和对现有系统的扩展。当一个团队中的程序员忙得不可开交的时候,一个好的运维能帮助程序员分担40%甚至更多的工作量。本书也介绍和挖掘了后台编码过程中的各种配置和搭建,比如HTTPS的配置、Websocket的Python实现等。如果你是运维工程师,或多或少会从书中汲取一些知识。

Python程序员。Python能做什么?它也能编写游戏服务器吗?答案是肯定的。只要你做得好,搭配得当,使用Python编写游戏后台不会比其他语言差(比如Java),有时候甚至更方便。如果你是Python程序员,又希望涉猎游戏后台的开发,本书一定会对你有极大帮助。

如何阅读本书

本书内容从逻辑上共分为三大部分。

第一部分的内容包括第1~3章,主要介绍了Python中网络的基础模块、通信加密,以及一部分服务器实作。其中:

第1章的内容包含Socket套接字的介绍和使用、基础send和recv方法、阻塞和非阻塞方式、urllib和urilib2等Python基础库的使用。

第2章介绍了通信加密,其中包括基础的异或加密、对称和非对称加密,以及OpenSSL、SSL/TLS通信方式等的详细介绍。

第3章开始使用Python代码编写实际可运行的服务器代码,并介绍了websocket协议、GIL的优劣,以及Python线程池的使用。  第二部分的内容包括第4章和第5章的内容,介绍了基础内存存储和存储方案。

第4章主要介绍了内存存储的基础内容;包括常用的几种数据库,内存与10续写速度,同步内存数据等。

第5章从存储方案展开,结合实例对几种常用的存储方案进行了介绍,如高并发服务器的存储方案等。

第三部分内容包括第6~12章的内容,深度挖掘了分布式、集群、MMORPG服务器类型的交互、弱连接和长连接、服务器承载方案等。在大部分章节中,都包含了:

基本内容:有关本章所需要的知识点和内容的介绍。

代码示例:在介绍完内容后,就会有代码示例,以解决基本内容中所提出的问题。

示例图(表):对于基本内容或者代码示例介绍仍然不清楚的通过示例图进行更详细剖析。

结果:运行完代码后可能获得的结果。

除了以上内容外,书中还包含以下内容,目的是对书中涉及的特定内容进行解释和

说明:

本章小结:主要章节的结尾写有“小结”,小结分为两种。

·内容小结:有关本章内容的总结。

·代码小结:对代码进行总结,让读者对所阅读的代码有更深的认识。

粗体字:对于知识点的重要提示或者读者容易混淆和忽略的地方,使用了粗字体

进行了提示。

勘误和支持

由于笔者水平有限且撰稿时间有限,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。读者可通过以下途径联系并反馈建议或意见:

即时通信:添加个人QQ(37856)或微信(darkspycyber)反馈问题。

电子邮件:发送email到darkspycpp@gmail.com。

致谢

在本书的撰写过程中,笔者得到了来自多方的指导、帮助和支持。

首先要感谢的是机械工业出版社华章公司的副总编辑杨福川老师。本书是笔者的处女作,杨老师在起初定内容和目录的时候,不辞辛劳,耐心地给笔者这个完全不明白如何系统写书的人相当多的指点和帮助,为此书的撰写提供了方向和思路指导。

其次要感谢我的良师益友赖永浩,即《编写高质量代码:改善Python程序的91个建议》的作者。他给了我极大的帮助和鼓励,在Python领域他几乎是无敌的(笑),能和他共事并且一路走来非常地荣幸和开心。

再次,要感谢在各个项目和工作中提供宝贵经验和支持的良师益友和工作伙伴们,他们是(排名不分先后):王永梅、吴东源、陈文亚、李明江、金李东、李汉曦、王云根、徐逸峰、常萌、赵云峰、王英全等。

另外,还要感谢全程参与审核、校验等工作的孙海亮老师,以及其他背后默默支持的出版工作者,他们的辛勤付出保证了本书能够顺利面世。

最后感谢我的父母、家人和朋友,有了他们,我才有精力完成本书的全部撰写工作。

谨以此书献给热爱编程、热爱游戏、热爱IT工作并为之奋斗的朋友们,愿大家身体健康、生活美满、事业有成!

蔡能(DarkSpy)

书评(媒体评论)

现在越来越多的年轻人通过玩游戏来释放工作压力。因此,如何保障用户在游戏过程中能够有—个流畅、稳定、愉悦的体验,成为游戏开发工作的重中之重。

市面上讲服务器架构和优化的书不少,在极客邦科技每年举办的QCo r1全球软件开发大会、ArchSummit全球架构师峰会等技术大会上,架构、性能优化也一直是最受欢迎的主题。但是,由于游戏行业的特殊性,专门阐述该行业架构和优化的论坛和书籍一直寥寥无几。

蔡能是网易的早期员工,在软件研发领域有着20多年的经验,他这本书正好填补了这个空缺。无论你是游戏开发者,还是运维工程师,通过本书,都能让你对游戏开发和运维所涉及的核心技术有更深入的了解,从而帮助自己高质高效地完成现有工作,最终从更高的层面去分析、解决业务问题,成为一名优秀的技术人员。

——霍泰稳 极客邦科技创始人兼CEO

我内心深处,对游戏行业的研发人员是极其尊敬的,因为他们要提供比金融机构更加准确和实时的服务体验,容不得半点马虎,否则就会遭到玩家的投诉,进而导致用户流失。而这其中,连通性和服务器开发是重中之重。本书会让从事游戏开发、架构和运维的工程师们受益良多,一方面可以帮助他们了解游戏服务器开发与架构的逻辑,另一方面可以帮助他们进一步拓展思路,触发更多的思考。

——于洋 TalkingData Growth Hacker负责人

随便看

 

Fahrenheit英汉词典电子书栏目提供海量电子书在线免费阅读及下载。

 

Copyright © 2002-2024 frnht.com All Rights Reserved
更新时间:2025/11/22 6:50:27