客户端与服务器的关系


  游戏客户端(client)类似于网站的前台页面,只是用于内容的显示与用户接口,除了一些配置文件外,不会保存任何实际数据。客户端启动后与服务器(server)建立联系,不间断的从server获取所需数据,数据的传输通过socket套接字完成,以发送接收数据包(packet)的形式交互,packet是个struct结构体,一般有命令id、长度、用户id以及其他成员变量组成。

 

  packet作为数据包的基类,可以派生n多个子类,每个子类表示不同作用的数据包,比如packet_login、packet_move,通过命令id知道这个packet的作用,然后将packet基类指针转换为对应的子类指针,比如 packet_login* pData =(packet_login*)pPacket; 由于数据包的格式client与server端都需要,一般将数据包相关的文件用标准c++编写,client与server用同一份文件,修改起来方便。socket相关的基础代码写好后就不会再去修改,扩展功能时只需定义新的packet类型,工作重心是在业务逻辑的处理上,而非底层代码,因此不懂socket如何编写也无妨,稍微了解一下即可,关键还是c++的掌握理解。

 

  “客户端模拟,服务器验证”,client存储一小部分数据,server存储所有数据,包括client当前状态的数据,一切动作都必须向server发出请求,得到回复后才能执行。用c++编写client生成的exe虽然是二进制文件,但在熟悉反编译的外挂高手看来,和看c++源代码并无太大区别,如同网站的javascript,不能相信client的安全性,一般在做一件事情时,client会先行验证是否满足条件,再请求server,server收到请求后会再次验证,只在client验证是危险的。举个例子,用户创建角色要限制名字在7个字符内,但只在client作了限制,当用户输入超过7个字符时,弹出个提示框报错后直接return,但没有在server端验证,对于普通用户来说没有问题,但若是外挂程序绕过了client的判断,确实会创建出很长的名字,这个时候就尴尬啦,总不能删号吧!做client时要假定代码会被外挂破解,这样才能防患于未然。

 

  建立了client与server的交流接口后,剩下的就是两边各自的逻辑控制了,实际开发中最好一个人写server,一个人写client,这样不会混淆代码,但也有人手不足的时候,就1个人两边都写,这样确实节省了劳动力,提高了单人能力,却也容易滋生bug。

posted @ 2011-11-10 00:00  喵了个咪  阅读(1435)  评论(0编辑  收藏  举报