5.6 支持rungate的服务器框架实例.htm
来自「Windows2000后台服务程序开发手册」· HTM 代码 · 共 344 行 · 第 1/2 页
HTM
344 行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0064)http://www.acejoy.com/Html/Article/network/5620061012192228.html -->
<!--ace website head--><HTML><HEAD><TITLE>支持RunGate的服务器框架实例[ACE开发者-专注网络编程开发]</TITLE>
<META
content=支持RunGate的服务器框架实例,RunGate,服务器,框架,实例,Proactor,Client,Server,网络游戏,服务器架构,ACE,编程,开发,程序员指南,VC,C++,网络编程,学习,入门,笔记,ICE,TAO,ACE框架,ACE开发论坛,高性能,服务器,服务器端,后台程序,中间件,网游,Server,IOCP,EPOLL,完成端口,设计模式,异步,socket,windows,linux,unix,Reactor,Proactor,日志,定时器,Thread,线程池,主动对象,ACE_Streams,ACE_Module,Configurator,ACE_Task,ACE_Message_Queue,ACE_Proactor,ACE_Reactor,ACE_Process,消息队列,命名服务,并发,同步,互斥,事件,面向对象,P2P
name=keywords>
<META
content=支持RunGate的服务器框架实例[一般采用Client/Server架构来开发网络游戏,客户端和服务器一般通过TCP协议进行通信。在设计游戏服务器的过程中,如何保证服务器的安全和最大限度的支持更多的客户端连接是摆在开发者面前一个重要的问题。为了解决上述两大问题,根据我们的经验,在开发游戏服务器的的过程中,采用如下的服务器架构可有]
name=description>
<META content=TRUE name=MSSmartTagsPreventParsing>
<META http-equiv=Content-Language content=zh-CN>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=MSThemeCompatible content=Yes><LINK title=""
href="http://www.acejoy.com/RssFeed.Asp?ChannelID=1" type=application/rss+xml
rel=alternate><LINK href="6.支持RunGate的服务器框架实例.files/Css2.css" type=text/css
rel=stylesheet>
<SCRIPT language=JavaScript src="6.支持RunGate的服务器框架实例.files/stm31.js"></SCRIPT>
<SCRIPT language=JavaScript src="6.支持RunGate的服务器框架实例.files/Font.js"></SCRIPT>
<META content="MSHTML 6.00.2900.3132" name=GENERATOR></HEAD>
<BODY>
<DIV class=twidth4>
<DIV class=twidth3>
<DIV class=twidth2>
<DIV class=twidth1>
<DIV class=twidth>
<TABLE id=sitehead cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD class=l></TD>
<TD class=m>
<TABLE width="100%" align=center>
<TBODY>
<TR>
<TD align=middle width=200><A title=ACE开发者
href="http://www.acejoy.com/"><IMG height=60 alt=""
src="6.支持RunGate的服务器框架实例.files/logo.gif" width=180 border=0></A></TD>
<TD align=middle><A href="http://shop34292573.taobao.com/"
target=_blank><IMG height=60 alt=贝贝花花包包店,精品555皮具,钱夹,皮夹
src="6.支持RunGate的服务器框架实例.files/bao.gif" width=486 border=0></A>
<DIV align=center><BR></DIV></TD>
<TD style="LINE-HEIGHT: 120%" align=middle width=100><A
onclick='this.style.behavior="url(#default#homepage)";this.setHomePage("http://www.acejoy.com");'
href="http://www.acejoy.com/Html/Article/network/5620061012192228.html#">设为首页</A><BR><A
href='javascript:window.external.addFavorite("http://www.acejoy.com","ACE开发者")'>加入收藏</A><BR></TD></TR></TBODY></TABLE></TD>
<TD class=r></TD></TR></TBODY></TABLE>
<TABLE id=navbar cellSpacing=0 cellPadding=0>
<TBODY>
<TR>
<TD class=l></TD>
<TD class=m><A class=ochannel title=ACE网络编程开发论坛,专注网络软件的开发!
href="http://www.acejoy.com/Index.asp">首页</A><!-- 频道名称分隔 --> <IMG
src="6.支持RunGate的服务器框架实例.files/navbar_separator.gif" align=absMiddle
border=0> <A class=nchannel title=关于网络开发的文章,涉及ACE的编程使用开发
href="http://www.acejoy.com/Article/Index.asp">文章</A><!-- 频道名称分隔 --> <IMG
src="6.支持RunGate的服务器框架实例.files/navbar_separator.gif" align=absMiddle
border=0> <A class=ochannel title=资源,源码,软件,开发书籍,下载
href="http://www.acejoy.com/Soft/Index.asp">资料</A><!-- 频道名称分隔 --> <IMG
src="6.支持RunGate的服务器框架实例.files/navbar_separator.gif" align=absMiddle
border=0> <A class=ochannel title=专注网络软件开发,ACE的使用,跨平台应用
href="http://www.acejoy.com/bbs/index.asp" target=_blank>论坛</A></TD>
<TD class=r></TD></TR></TBODY></TABLE>
<TABLE id=navsub cellSpacing=0 cellPadding=0 align=center>
<TBODY>
<TR>
<TD class=l></TD>
<TD class=m
style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px"> 位置: <A
href="http://www.acejoy.com/">ACE开发者</A> >> <A
href="http://www.acejoy.com/Article">文章</A> >> <A
href="http://www.acejoy.com/Html/Article/network/5_Index.html">网络编程</A>
>> 正文</TD>
<TD class=r></TD></TR></TBODY></TABLE><!--网站头部结束--><!--acejoy.com栏目部分--><!--
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="1" align="left" bgcolor="#F0F0F0"></td>
</tr>
<tr><td align="left"><script language = "JavaScript" type="text/javascript" src="/Js/ClassMenu/ClassMenu_1.Js"></script></td>
</tr>
</table>
--><!--文章频道Show模块 -->
<SCRIPT language=JavaScript>
function fontColor(objname)
{
var arr = showModalDialog("/Editor/Dialog/selcolor.htm", "", "dialogWidth:18.5em; dialogHeight:17.5em; status:0; help:0");
if (arr != null) setColor(objname,arr);
}
</SCRIPT>
<DIV class=mframe>
<TABLE cellSpacing=0 cellPadding=0 width="100%">
<TBODY>
<TR>
<TD class=tl></TD>
<TD class=tm>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD width="77%"><SPAN class=tt>阅读→</SPAN><FONT
color=#999999>支持RunGate的服务器框架实例</FONT></TD>
<TD width="23%">
<DIV align=right><FONT color=#ff0033>热</FONT> <FONT
color=green>荐</FONT> <IMG alt=4星级
src="6.支持RunGate的服务器框架实例.files/Star4.gif"
border=0></DIV></TD></TR></TBODY></TABLE></TD>
<TD class=tr></TD></TR></TBODY></TABLE>
<DIV id=printBody>
<TABLE id=middle
style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all; TEXT-ALIGN: left"
cellSpacing=0 cellPadding=0 align=center>
<TBODY>
<TR>
<TD class=ml></TD>
<TD class=mm vAlign=top><BR>
<DIV align=center>
<H1 class=aTitle>支持RunGate的服务器框架实例</H1></DIV>
<TABLE width="97%" align=center>
<TBODY>
<TR>
<TD width=502>
<DIV align=center>[日期:2006-10-12 来源:<A
href="http://www.acejoy.com/" target=_blank>ACE开发者</A><SPAN
id=SourceLabel></SPAN> 作者:尚海忠<SPAN
id=AuthorLabel>]</SPAN></DIV></TD>
<TD align=right width=209>
<DIV align=center>[字体: <INPUT title=把正文字体缩小 style="HEIGHT: 16px" onclick="fontSize('m','ArticleBody')" type=button value=小>
<INPUT title=把正文字体扩大 style="HEIGHT: 16px" onclick="fontSize('b','ArticleBody')" type=button value=大>
<INPUT title=转为简体中文模式 style="HEIGHT: 16px" onclick="bodytojt('ArticleBody')" type=button value=简>
<INPUT title=转为繁体中文模式 style="HEIGHT: 16px" onclick="bodytoft('ArticleBody')" type=button value=繁>
<A href="javascript:fontColor('ArticleBody')"><IMG alt=字体颜色
src="6.支持RunGate的服务器框架实例.files/fgcolor.gif" align=absMiddle
border=0></A>]</DIV></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=5 cellPadding=0 width="100%" align=center border=0>
<TBODY>
<TR>
<TD vAlign=top>
<TABLE cellSpacing=0 cellPadding=10 align=left border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE>
<DIV class=content id=ArticleBody
style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
<P
align=left>当前,一般采用Client/Server架构来开发网络游戏,客户端和服务器一般通过TCP协议进行通信。在设计游戏服务器的过程中,如何保证服务器的安全和最大限度的支持更多的客户端连接是摆在开发者面前一个重要的问题。<BR>为了解决上述两大问题,根据我们的经验,在开发游戏服务器的的过程中,采用如下的服务器架构可有效解决上述两个问题。</P><BR>
<P align=center><IMG onmousewheel="return bbimg(this)" alt=""
src="6.支持RunGate的服务器框架实例.files/showimg.htm"
onload="javascript:if(this.width>500)this.style.width=500;"></P><BR>
<P>图:支持RunGate的游戏服务器架构</P><BR>
<P>在该架构下,Client和RunGate相连,而不是直接和GameServer相连。RunGate主要负责转发客户端和GameServer之间的数据包,GameServer负责处理游戏的所有逻辑。</P><BR>
<P>采用该架构,有如下几个优点: </P><BR>
<P>1、客户端通过RunGate和游戏服务器GameServer相连,GameServer
IP对外不可见,这样GameServer更安全,更不易受攻击。一个GameServer对应若干个RunGate,当某个RunGate受攻击或荡机后,其它的RunGate扔然照常运行,和其它RunGate相连的客户端仍然可正常玩游戏。</P><BR>
<P>2、GameServer可支持更多的客户端连接。GameServer把众多的客户端连接分散到多个RunGate中去,而不是独自来承担,从而可支持更多的客户端连接。</P><BR>
<P>3、RunGate可分担一部分安全管理工作,减轻GameServer的压力。例如若某个客户端在一段时间内不发数据包,则把该客户端踢下线的工作可由RunGate来完成。<BR>那么该架构下的GameServer如何来设计呢?在开发游戏的实践中,针对该服务器架构,提出了一个支持RunGate的服务器开发框架,并在《三国豪侠转》服务器中获得了广泛应用,经过了实践的检验。下面对该框架进行详细介绍。</P><BR>
<P><B>一、一个支持RunGate的服务器[GameServer]开发框架</B></P><BR>
<P>GameServer有如下两个基本功能:</P><BR>
<P>1、管理和它相连的RunGate以及通过RunGate和GameServer进行通信的客户端;</P><BR>
<P>2、解析客户端通过RunGate转发来的数据包,根据具体协议处理每一个数据包;<BR>在该框架中,主要有四个相关的类CRunGateCtrl、CRunGate、CPlayer、CPacketParser。下面详述这些类的接口及其主要功能。</P><BR>
<P>CRunGateCtrl的功能和接口定义<BR>
类CRunGateCtrl在GameServer中,负责管理和它相连的RunGate。其主要功能有:<BR>
侦听RunGate的TCP连接,当
某个RunGate连接到来时,CRunGateCtrl就创建一个CRunGate对象来管理该RunGate。<BR>
维护一个CRunGate列表,当一个RunGate连接到来后,就创建一个CRunGate对象插入到该列表中;当某个RunGate关闭或断开连接时,就把该对象从列表中删除。<BR>
当GameServer关闭时,释放所有资源。包括关闭侦听端口、把CRunGate从列表中清除等功能。<BR>类CRunGateCtrl的定义如下:<BR>//SOCKET为GameServer侦听RunGate到来时accept返回的套接口描述字<BR>typedef
std::map<SOCKET, CRunGate*> CRunGateMap;<BR>class
CRunGateCtrl<BR>{<BR>public:<BR>CRunGateCtrl();<BR>~CRunGateCtrl();
<BR>//开始侦听RunGate的TCP连接<BR>void StartListen(int
nListenPort);<BR>//停止侦听,清空m_RunGateMap,释放所有相关资源<BR>void
StopListen();<BR>//获得当前连接到Server上的RunGate数目<BR>int
GetRunGateNumbers(); <BR>// 函数说明
:当一个新的RunGate连接到Server时,就new一个CRunGate对象来管理该连<BR>//
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?