随便聊聊
我接触过的软件,最早定义为C/S(Client/Server)和B/S(Brower/Server),如今传统意义上的C/S程序已经很少了,其实App和网络游戏还归位这一类。但更多的是B/S程序,基于各种浏览器的各种……有些朋友一直在做客户端的种种,比如说APP、手游客户端或是Web前端,对服务器端的知识很茫然,其实不然,从基础代码结构来讲,现在的客户端也很丰富了,什么MVC、MVVM架构应用都已经很成熟了,本地存储也OK,如sqlite、file什么的,也写过很多与服务器端交互的代码。这篇简单聊聊Web服务器和游戏服务器。
网络&系统
服务器端,最重要的就是网络,网络这块知识,看完《Unix网络编程》就无敌了。从现实工作应用中来看,HTTP、TCP、UDP是应用最广泛的,还有一些特殊的协议。
操作系统层面,需要了解进程、线程,尤其线程方面,再具体到框架实现即可。当然想深深的学习下操作系统也是可以的。。
Web服务器
几乎绝大多数的Web应用都是基于Http的,有空可以看下RFC-2616。Java里有Servlet,Node.js和Scala和Clojure和Golang、Python什么的都有自己的Http封装,PHP里有apache和nginx的CGI,有了这些,就可以解决客户端和服务器端通讯的问题了,服务器端要做的事情很多时候和客户端要做的类似,做一些逻辑处理,做一些持久化操作(数据库),也可能会与外部接口打打交道,然后将结果扔给客户端,基本就大功告成。只是在大架构方面的确需要比客户端健壮些(也可能是我没见过大型游戏)。如果想入门Web服务器端开发,第一步就是学习Http,然后找一门你喜欢的语言,进行语法学习,HTTP库的学习,持久层的学习,基本就可上手了。简单聊一下语言,Java做Web其实很蛋疼,各种框架。。Node其实相对轻一些,不过也不太轻。。PHP呢,世界上最好的语言没有之一,其实我接触PHP是在5.4+的版本,语言&框架层面使用起来很方便,性能方面也还凑合,5.4-我就不想吐槽了。。Scala这种强类型&函数式很不错,预计再过2-3年国内会火。。
多聊一点的话,现在的WEB也有很多应用使用长连接的,基于Web Socket的居多吧,。还有就是现在大家都追求NIO、异步、queue等来处理并发,在很多架构上都游刃有余,有大名鼎鼎的Netty,JVM上有Typesafe的Akka,Node天生异步风,都不错。
游戏服务器
游戏服务器我接触的并不多,但是要比Web服务器端做起来有意思多了。游戏服务器的消息定义一般分为几类:
1、请求/响应 - 像HTTP
2、通知 - 客户端只是向服务器端发送命令,不需后续任何处理
3、推送 - 服务器端主动向客户端发送命令
游戏服务器端都是使用长连接,大多数都是基于TCP,也有对UDP包装的很不错的案例。具体协议方面就不扯了,我也没那么懂。从应用层面上,游戏服务器端是有状态的,所以架构方面不会像Web服务器一样可水平扩展,还有一点特殊的就是游戏线上的各种数据一般都在内存中存储,有一定机制去同步到物理硬盘,这种做法是因为游戏的操作太频繁,可能你在游戏中走一步,需要推送的消息就有无数。
入门的话,学习TCP、UDP,找几个技术框架,如Photon(C#)、Mina、Netty、Pomelo(Node.js),C++的不太了解,应该有很多很多的历史架构都是基于C++的,各家都是有自己的游戏引擎,也或者都是自己写的Socket。首先学习消息处理方面,这样在服务器端也是一样的套路,各种逻辑校验,持久化,消息返回。至于怎样的架构是好的,怎样的代码结构是好的,这个仁者见仁了,没事儿上Github溜达溜达,总有适合你的!