25 个回答
目前C++做服务器,多用于高并发及时性强的领域,比如游戏,金融等。而游戏服务端编程主要是三个方面,网络,数据存储,逻辑处理。后两个方面各公司有不同的策略,可以进入公司再了解。而游戏服务器编程的重中之重就是网络,如果你精通了Cpp网络编程,学习任何公司的框架都不成问题。下面着重讲解如何进阶网络部分。
先了解什么使网络编程,简单的实现TCP/UDP单线程阻塞编程。之后学会在accept时候开辟线程,多线程服务器如何运行。了解这些之后,进一步学习I/O多路复用,epoll和select足够了,游戏服务器目前都发布在linux上,所以主攻epoll模型,原理,了解如何注册时间,epoll_wait抛出事件。windows上了解select即可。这个阶段你要熟悉Cpp语法和基本的网络编程入门,推荐图书为:
学习完这本书你就了解了cpp网络的基本原理和编程,下一步需要了解Reactor设计模式和Proactor设计模式,因为大部分游戏服务器都采用的是这两种中的一种实现的。上面的书已经简单讲述了Reactor模式和Proactor模式。你需要结合实际的网络库源码领悟了。推荐你学习libevent和redis源码,有本文档是libevent源码分析,基于C实现的,但是思想采用的是Reactor模式。
文档连接: https:// blog.csdn.net/sparklian g/article/details/4957667
我自己的C++服务器编程总结: https://www. cnblogs.com/secondtonon e1/category/837519.html
基于Reactor实现的简易服务器框架
https:// github.com/secondtonone 1/betternet
这些都学完了,接下来扩充你的眼界,继续深化学习大神的网络编程思路和框架,推荐学习boost::asio,里边实现的是Proactor模式,将epoll和iocp封装城跨平台的网络库。学习地址,官方学习是最快的: https://www. boost.org/doc/libs/1_67 _0/doc/html/boost_asio/examples.html
采用了C11,C03,C17分别实现了echo server,http,websocket等服务器。我根据官方文档,做了一个基于boost::asio的server,8000并发连接pingpong协议测试,10ms左右。
我的server地址:
我封装了tcp和websocket的解析和切包。感兴趣可以看看。
接下来需要进一步拓宽自己的思路,继续学习,推荐几本优秀的资料,也是我在读的图书
陈硕老师结合工作实践编写的,五星推荐,非常优秀。
unix网络编程,套接字编程三本,有时间啃一啃,能填补自己思想和知识的不足。
做C++游戏服务器,网络是内功,懂得越多写出来的框架就越熟练。目前各大游戏公司都有自己的游戏服务器框架,不需要自己造轮子了,但是了解这些可以让你更快速地熟悉服务器运行流程。另外推荐几个目前高性能的游戏服务器,楼主可以看看源码
kbengine
开源服务器框架,底层C++,上层用python写逻辑即可,前后端通信有自己的序列化和sdk
photon server
开源服务器框架,底层C++实现,上层开发可用js,python,C++,C#等等。
接下来游戏服务器逻辑,如果采用C++编写,就要熟悉stl基本的模板和容器,一些常用的单例模式等等。
数据库方面,游戏服务器采用mongodb和mysql的较多,当然也有用redis做缓存的。
祝楼主学习愉快,下面是我购买的一些教程,感兴趣可以学习下
1、c++语言本身
如果是只推荐一本的话,必定是 《c++ primer 5》 ,读完此书从入门到精通不敢说,但是却有一种c++嘛 everything is under control的感觉。而且本书是c++11标准重写, @Milo Yip 、 @vczh 审校,c++界无人不晓的一个入门经典之作。
2、网络
《unix网络编程第3版》 卷一
这本书比较系统仔细的讲解了unix系统上的网络编程。这个书比较厚,但确是网络编程必读之作,个人认为可以跳过一些目测用不上的知识点比如说sctp、广播、多播
《muduo多线程网络库》
muduo多线程网络库,不只是网络。c++除了stl就没有什么库了,所有c++很多项目都是在自己写网络库的。而 @陈硕 希望能够实现一个开源的网络库,让大家不用重复造轮子,所以就有了muduo库。muduo库对网络、线程进行了封装,还提供了日志系统、定时器等。而且设计比较简洁,并没有太多面向对象的设计,而是大量使用函数回调。而且源代码不多,非常适合刚毕业的大学生学习和使用。
kcp
kcp是一种可靠udp,是一套纯算法的来保证udp包有序、不丢失。那么问题来了,这说的不就是tcp吗?为啥还要可靠udp这个东西,原因在于有很多场景对网络延迟要求非常高,游戏中的实时对战就是这样的场景,如果直接使用tcp延迟太高会很卡,如果直接使用udp会丢包,无序。kcp和tcp都会保证可靠,但问题是kcp为何在保证可靠的情况下比tcp快。tcp是很多年前设计的,在低延迟的场景下tcp并不能很好的胜任,kcp改进了tcp的不足:RTO翻倍vs不翻倍、快速重传、延迟ACK vs 非延迟ACK、选择性重传 vs 全部重传。换句话说,tcp的实现编译进了操作系统,而kcp是一套算法,基于udp传输,可以灵活的调整一些参数来提高传输速度,降低延迟。
3、linux系统编程
c++服务器跑在linux上,所以了解 熟练使用linux操作系统提供的api也是非常重要的,比如说你想让你的程序变成守护进程, 自定义一些信号的处理,创建子进程,使用多线程,system调用。这里推荐 《unix高级环境编程》 。
4、数据库
除了了解sql的常用查询操作之外, 还需要重点掌握 redis
现在支持高并发的场景越来越多,对面每秒上万次的读写请求,磁盘io成为性能瓶颈。这个时候nosql数据库抛弃传统关系形数据库的事务等一些复杂的机制,针对特定的应用场景做设计优化。redis就是nosql中key-value数据库的代表.redis数据存储在内存中,只支持key-value的查询存储方式。所以redis非常快,而且redis还支持集群、主从、发布订阅、持久化。学习redis我推荐黄健宏 《redis设计与实现》 ,本书讲解的非常简洁清晰,看完此书再选择感兴趣的部分进行源码阅读,可以达到事半功倍的效果。其他redis的书都不值得推荐,这一本足以。作为服务器开发人员,redis本身就是服务器,了解redis网络、集群的实现也能学到很多服务器相关知识。从算法层面上来说,阅读redis数据结构的实现,可以带我们领阅跳跃表、字典、反向二进制迭代器遍历字典等的实现。
5、网络通信协议
protobuf
特点是传输时会对数据进行压缩
flatbuffers
特点是用一段连续的缓存区存储数据,传输时不需要序列化和反序列化