第8卷第5期
2009年5月
软件导刊
Software Guid,
Vol 8 No 5May 2009
邓 丽,董 玮
,大连东软信息学院计算机科学与技术系,辽宁大连,(6023)
摘 要,研究了网络游戏服务器端程序设计与实现,主要实现客户端,服务器端模式,C/S,中的服务器端程序。分析了在实现程序设计中所需要解决的关键问题和通信协议,从而解决了服务器端程序的实现。
关键词,网络游戏,客户/服务器,网络库,通信协议
中图分类号(TP3),.,2 文献标识码,A 文章编号, (6)2-(800)2009(05),(3),,2
1 解决的关键问题
1.1 Epoll
网络服务器的瓶颈之一就是IO的效率,为了支持更多的玩家同时在线, 网络库用到了Linux2.6内核中提供的System Epoll的解决方案。传统的select以及poll的效率会因为在线人数的线形递增而导致呈二次乃至三次方的下降,直接导致了网络服务器可以支持的人数有了比较明显的限制。 自从Linux 提供了/dev/epoll的设备以及后来2.6内核中对/dev/epoll设备的访问的封装,System Epoll,之后,大大的缓解这一现象,
1.2 I/O完成端口
在Windows平台下IOCP是大型网络架构的首选。微软在Winsock2中引入了IOCP这一概念。 IOCP全称I/O Completion Port,中文译为I/O完成端口。IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序。与使用select,,或是其它异步方法不同的是,一个套接字(socket)与一个完成端口关联了起来,然后就可继续进行正常的Winsock操作了,然而,当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中,然后应用程序可以对核心层进行查询以得到此完成端口,
1,3 公平调度
由于服务器有成千上万的客户,当在决定下一个处理什么时,你不能简单地在所有客户中重复甄选,在一个典型的游戏中,每个客户向服务器提交新命令的速率和从服务器返回的响应速率是成比例的,假设每个响应要花,0毫秒,那么当有,0个客户时,响应时间的范围在,0~,00毫秒之间,假设所有的指令同时发出,,相对于正常情况下玩家的决策时间,这是足够短的,然而,当有,0000个连接客户时,并且是用一个单线程按顺序服务它的话,范围就会在,0~,00000毫秒之间,就算响时间不到,毫秒,该范围也仍在,毫秒到几秒钟之间,恰好在客户
和服务器之间额外的网络迟延,这个范围己足够宽得让一些客户无法得到处理,
1.4 过载链式反应
一旦服务器过载,系统经常会遭受链式反应,会对游戏产生灾难性后果,当服务器严重负载时,每单元工作的处理时间就会增加,随着每个任务要花费更长的时间来处理,窗口出现非确定行为的机会就开始增大, 以前没出现过的全新BUG也会出现,最麻烦的是当系统负载不高的时候,这些BUG一般不会重复出现,
同时,可用资源(CPU)RAM等,的减少降低了同一台服务器上其他进程的吞吐量,因此它们也开始变得过载,解决第一个过程的过载可能只需要很短的时间,但该链式反应带来的副作用可能会消耗系统大量的时间,这就是为什么需要谨慎额外防护我们的系统,因此在“正常情况下”,服务器工作比正常要求还要快些,这就保证了,当引起暂时过载的因素消失时,服务器能迅速返回到较为轻松的负载状态,
1.5 处理过载
无论服务器的实现有多好,它都可能在某点开始过载,最重要的是在这种情况下决定做什么,然后记住用这个策略来编写服务器的各种组件,玩家的数量达到峰值,或者内部的迟延造成请求/响应聚成一团,都可能导致服务器负载达到峰值,最差情况的设定是没有处理过载,当过载发生,游戏会急剧下降到一个无法玩的状态,试图连接游戏的新玩家会发现游戏,中止”。当客户事实上己经长时间等待服务器来处理时,他们会假定它己经崩溃。另外,每个坚持等待进入的玩家会造成游戏更加慢。
前两步骤先是停止负载的进一步增加,然后开始降低负载。这除了提高服务器的性能外,使得过载也会很少发生。有些服务器颠倒了这两步的次序,草率地断掉客户连接,这仅仅使那些客户马上打算去重新连接而己。
作者简介,邓丽(197)-, ,女,辽宁沈阳人,硕士,大连东软信息学院讲师,研究方向为通信及数据库,董玮(19)5-),女,陕西西安人,博士,大连东软信息学院副教授,研究方向为网络多媒体应用。
136 ·
2009年件导刊 2009年件导刊 2009年件导刊
对于试图使用过载服务器的新客户,需要指定为最高优先级。 目的是为了让它们尽可能快地离开,也避免他们很快地返回。最好发送一条特殊的消息。使得客户在一段给定的时间内拒绝重试。这段放弃时间应该是随机产生的,否则当大量的客户在同一时间全都试着重新连接时,以新形式表现的过载可能会产生的,就会导致服务器在过载和过载之间振荡。
降低现有的负载可以通过游戏中决策,退出过分活跃的玩家, ,或者是在提高吞吐量算法中用一个变量来完成。断开由那些算法评估得到的10%最不合意的客户,这一做法可以在极端的情况下使用。过载的服务器通常对谁都没有好处,在大多数情况下,有部分玩家断线好过游戏一点也不能玩。
1.6 字符串匹配算法
主要研究玩家聊天信息的过滤,过滤技术的难点在于字符串匹配算法。在字符串匹配算法中分别研究了BF算法、BM算法和ZZL算法。
2 系统架构
网络游戏服务器端的开发流程被划分为三个阶段,
(1)网络库的开发,在操作系统提供的接口基础上封装自己的网络库。这是最为重要的一步,因为以后的逻辑实现的开发都要在此基础上去扩展。
(2)通信协议的制定,定义客户端与服务器端,服务器端与服务器端的通信规则。
(3)逻辑功能的实现,按照不同的功能需求开发相应的模块,如,加入游戏,聊天,商城等。
2.1 客户/服务器编程模型
2.1.1 服务器端
(1)创建套接字,调用Socket函数创建一个待使用的套接字。通过这个函数的参数定义了套接字的类型、网络地址类型和使用的协议。
(2)绑定套接字,使用bind函数绑定套接字,通过它将创建好的套接字与本地地址和本地端口联系起来。
(3)监听套接字,使用listen监听来自客户的连接请求。
(4)建立连接,通过调用,ccept函数接受客户的连接请求。
(5) 网络通讯,使用send、sendto等函数发送数据,使用recv、recvfrom等函数接收数据。
(6)关闭套接字,在通讯结束后,使用closeSocket关闭不再使用的套接字。
2.1.2 客户端
(1)创建套接字,调用Socket函数创建套接字。
(2)建立连接,使用connect函数和服务器建立连接。
(3) 网络通迅,使用send、sendto等函数发送数据,使用recv、recvfrom等函数接收数据。
(4)关闭套接字,在通讯结束后,使用closeSocket关闭不再使用的套接字。
2.2 重新封装的网络库
网络库分为两套,一套用于服务器与服务器之间的少量连接,内网连接, ,采用最简洁朴素的阻塞I/O模型。其特性是维持一个稳定的长连接,提供大的数据吞吐量。另一套用于服务器与客户端之间的大量并发连接,外网连接, ,采用非阻塞I/O 模型。其特性是同时支持大量的连接,当连接堵塞到一定程度时会断开连接。网络库的开发语言为C++,只支持TCP协议。因为TCP传输控制协议,提供端到端的质量保证的数据传输,该层负责数据的分组、质量控制和超时重发等,应用层可以忽略保证数据传输可靠性的措施。
3 结束语
在进行网络游戏服务器端的程序开发时,我们需要先构建最基础的网络库,这也是最重要的一部分,因为游戏服务器端需要支持上万个同时在线的玩家,所以网络库性能的好坏将影响到整个项目的成败。为了使网络库能够在WINDOWS平台与LINUX平台上运行,我们在WINDOWS平台上运用了I/O完成端口技术,在LINUX平台上运用了Epoll技术,实现支持大量的同时在线玩家。还有根据不同的情况去选择最适合网络游戏服务器端开发的字符串匹配算法。
完成了网络库的开发后,重点设计大厅服务器与客服端,大厅服务器与游戏中心的通信协议。在设计通信协议的时候,考虑的重点在于如何能保证协议的可靠性,协议的设计也是为了满足上层逻辑模块的功能实现。
