网络游戏网络端引擎RakNet的架构

上传人:ni****g 文档编号:561695089 上传时间:2023-04-23 格式:DOC 页数:12 大小:63.50KB
返回 下载 相关 举报
网络游戏网络端引擎RakNet的架构_第1页
第1页 / 共12页
网络游戏网络端引擎RakNet的架构_第2页
第2页 / 共12页
网络游戏网络端引擎RakNet的架构_第3页
第3页 / 共12页
网络游戏网络端引擎RakNet的架构_第4页
第4页 / 共12页
网络游戏网络端引擎RakNet的架构_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《网络游戏网络端引擎RakNet的架构》由会员分享,可在线阅读,更多相关《网络游戏网络端引擎RakNet的架构(12页珍藏版)》请在金锄头文库上搜索。

1、网络游戏网络端引擎RakNet的架构目录网络游戏网络端引擎RakNet的架构1摘要1RakNet简介1RakNet的基本框架2RakNet的数据包结构4数据包优先权4数据包的可靠性4Unreliable5Unreliable sequenced5Reliable5Reliable ordered6Reliable sequenced6应用RakNet引擎的网络游戏框架6客户端:6“客户端连接”类:7服务器的处理过程8摘要网络游戏的整体架构主要包括客户端、网络端、服务器端和网页端,本篇读书报告主要来介绍网络端的开发,着重介绍了RakNet引擎的架构和应用。Raknet是一个基于UDP网络传输协议

2、的C+网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。同时Raknet是基于Berkeley Sockets和Winsock开发的,所以它支持WINDOWS系统和LINUX系统,可以在局域网,因特网上运行。当今的游戏大多支持两种模式的网络连接:对等模式和客服端/服务器模式,Raknet支持上述的两种模式。本文主要介绍了如何通过RakNet引擎实现网络游戏网络端数据传输时高效率和高安全性的平衡,已经如何设计一个简单的网络游戏网络端框架。RakNet简介Raknet是一个基于UDP网络传输协议的C+网络库,允许程序员在他们自己的程序中实现高效的

3、网络传输服务。通常情况下用于游戏,但也可以用于其它项目。同时Raknet是基于Berkeley Sockets和Winsock开发的,所以它支持WINDOWS系统和LINUX系统,可以在局域网,因特网上运行。当今的游戏大多支持两种模式的网络连接:对等模式和客服端/服务器模式,Raknet支持上述的两种模式。RakNet的基本框架在网络上,我们传输信息一般都是依靠TCP/IP协议的,而TCP/IP协议中传输信息的协议又包括TCP和UDP。TCP是指的面向连接的虚电路协议。也就是说,它在发送数据之前,要和用户建立连接,并一直保持和用户连接,然后发送数据,并不断询问用户是否收到正确的数据,如果不正确

4、,就重发,直到正确为止。UDP则是指用户数据报协议,它在发送数据之前,先和用户建立连接,连接建立好以后,并不一直保持和用户的连接,然后发送数据,也不管对方是否收到数据,然后关闭连接。从上面的描述可以看出TCP是相当可靠的一种连接方式,但它并不适合于游戏中。你可以想一下,如果一个玩家和服务器建立TCP连接,那么要等到这个用户断开和服务器的连接以后,其它用户才能使用服务器。这显然是不行的。而UDP能做到和多个用户同时通信。例如,一个玩家要取得他的个人资料,然后他向服务器发出一个请求,服务器用UDP回答他,并关闭和他的连接;服务器然后就可以处理其他玩家的信息了。RakNet的三个基本头文件如下:Ra

5、kClientInterface.hRakNetworkFactory.hRakServerInterface.h第一个头文件包含了建立客服端所需要的信息,其中包括客服端的建立,连接和数据的发送和接收。第二个头文件用于管理我们在程序中使用的类,包括类内存分配和类内存的释放。第三个头文件用于建立服务器所需用的信息,包括服务器的建立,连接和数据的发送和接收。部分代码如下:char str512;RakClientInterface *rakClientInterface;RakServerInterface *rakServerInterface;str512是用来判断我们是要建立服务器还是客户端

6、。接下来就声明一个客户端实例和一个服务器实例。printf((C)客服端 (S)服务器?n);gets(str);if (str0=c)rakClientInterface=RakNetworkFactory:GetRakClientInterface();rakServerInterface=0;printf(客服端已经建立。); elserakClientInterface=0;rakServerInterface=RakNetworkFactory:GetRakServerInterface(); printf(服务器已经建立。); 得到一个输入值,如果输入值为c,就建立客户端,然后将服

7、务器实例设置为空,如果输入值为其它,就建立服务器,然后就将客户端实例设置为空。RakNetworkFactory:GetRakClientInterface();初始化一个客户端实例,为它分配内存;RakNetworkFactory:GetRakServerInterface();初始化一个服务器实例,为它分配内存;最后,程序执行完成,我们就需要释放掉我们刚才分配的内存。if (rakClientInterface)RakNetworkFactory:DestroyRakClientInterface(rakClientInterface);else if (rakServerInterfac

8、e)RakNetworkFactory:DestroyRakServerInterface(rakServerInterface);RakNet的数据包结构在游戏的网络端中,最终你发送的数据是用户的角色的流。有两种方法可以编码你要发送的数据。一种方法是建立一个结构,另一个方法是内建一个比特流类。建立一个结构的优点就是能够非常容易地改变结构并且看到你实际发送了什么数据。这样,发送者和接收者就能够共享结构中相同的源文件,这样做就避免了不必要的错误。建立结构的缺点就是你将不得不经常改变和重新编译许多文件。也将失去在比特流中传输时压缩的机会。使用比特流的优点就是你不用改变任何其它的外部文件。简单地建立

9、一个比特流,把你想发送的数据写入比特流,然后发送。你也可以通过压缩来读写数据,然后通过bool值来判断数据是否被压缩。比特流的缺点是你现在一旦范了一个错误,那就不容易那么改变。数据包优先权enum PacketPriorityHIGH_PRIORITY,MEDIUM_PRIORITY,LOW_PRIORITY,NUMBER_OF_PRIORITIES;首先,数据包优先权是简单的。高优先权数据包在中优先权数据包之上,而中优先权数据包又在低优先权数据包之上。在游戏中不断提高数据包的优先等级是不正确的,因为这样会扰乱游戏。数据包的可靠性enum PacketReliabilityUNRELIABLE

10、,UNRELIABLE_SEQUENCED,RELIABLE,RELIABLE_ORDERED,RELIABLE_SEQUENCED;UnreliableUnreliable的数据包是直接被UDP寄出,它们可能按照顺序到达,也可能不会。用这种方法寄出的数据最好是不重要的,或者发送很多次,这样做的好处就是,遗失的数据包可以得到补偿。优点 这种类型的数据包不需要被网络告知是否到达目的地。缺点 数据包没有顺序,也可能不会到达目的地,如果发送内存是满的,首先抛弃的就是这种数据。Unreliable sequenced 不可靠的连续数据包和不可靠的数据包大体相同。就只有一点不同,那就是老的数据包被忽视,

11、只有最新的数据包可以被接受。优点 和不可靠的数据包差不多,因此你不用担心老的数据包会改变你的数据。缺点 大量的数据包在他们可能从未到达目的地的情况下丢失,也可能在到达目的地以后丢失。当发送缓冲区满了的时候,这些数据包首先被丢失。或是最近的数据包寄出后却从未到达。Reliable可靠的数据包是UDP通过一个可靠的层打包后发送到目的地的。优点 数据包将完整无缺的到达目的地。缺点 没有包顺序。Reliable ordered可靠性顺序包是UDP通过一个可靠层打包后,按照顺序发送到目的地的。优点 这种数据包将按照一定顺序被寄出。这样做的好处就是很容易编程,因为你不用担心如何组织它们或者遗失的数据包。缺

12、点 可能会占用额外的网络宽带。如果网络很繁忙的时候,数据包可能到达的非常慢。如果一个数据包晚到,那么将延迟许多数据包的到达。不管怎样,这个缺点可以使用顺序流来缓解。Reliable sequenced 可靠性连续数据包是UDP使用可靠层打包的,它的目的就是确保这些数据包可以按照连续的顺序到达目的地。优点 你可以得到UDP数据包的可靠性,顺序数据包的顺序,不用担心老的数据包。缺点 还是占用了大量的网络宽带。应用RakNet引擎的网络游戏框架客户端:首先用一个数据结构来表示客户端需要传送给服务器的消息:数据包数据包类型;鼠标开始位置;鼠标结束位置;这就是我们要传输的数据。如果想象一下,假如我要传输

13、我自己的游戏中的角色信息。那结构就会是下面这个样子:数据包 数据包类型; /角色信息 角色类型; /比如人,精灵,妖怪等等 操作方式; /比如是重新建立,更改,删除 角色所处地图; /就是它在那张地图上 角色所处地图坐标; /就是它在地图什么位置 角色生命值; . . .;“客户端连接”类:一个客户端连接类来管理和服务器的连接,数据包的处理和发送。我们首先来看一下这个类的成员函数和功能:1.构造函数 客户端连接类的构造函数有两个参数:用于连接的服务器IP地址(用字符串表示)和用于连接的服务器的端口号(也是用字符串表示)。这个函数的功能就是初始化Raknet网络连接并连接到服务器。2.析构函数

14、析构函数的功能就是关闭构造函数建立的连接,并且释放Raknet建立的网络结构。3.添加线坐标 这个函数的作用就是将我们为了画线时产生的坐标x,y添加到画线列表中。4.发送线到服务器 这个函数的作用就是发送我们画线用的坐标(或者点)到服务器。5.画线 这个函数与网络传输无关,主要就是将画线列表中的点连成一条线。6.侦听数据包 这个函数的作用就是检测从服务器传输过来的数据包,然后自动用下一个函数来处理它。7.处理数据包 它的作用就是从数据包中读出数据,然后显示到屏幕上。服务器的处理过程服务器可以用一个控制台程序来写,下面来看一下这个程序应该怎样来写。#include #include #include #include #include / for Sleep()/开始和客户端一样,首先包含Raknet的头文件。const unsigned char PACKET_ID_LINE = 100;/定义数据包的类型。服务器端不是使用的类,直接使用了三个函数:1SendLineToClients() 这个函数的目的就是将接收的信息广播给所有在

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号