2D网络游戏开发(网络篇)(三)

来源:互联网 发布:nginx 1.12 1.13 编辑:程序博客网 时间:2024/04/28 02:23
2D网络游戏开发(网络篇)(三)
 
作者:akinggw
 
在前面的章节中,我们已经讲解了Raknet是什么,如何在DC中配置Raknet,并测试了我们的第一个程序。
在这一篇中,我们将讲解Raknet的函数,并将写出我们的第一程序。
因为Raknet是基于Berkeley SocketsWinsock开发的,所以它支持WINDOWS系统和LINUX系统。可以在局域网,因特网上运行。
当今的游戏大多支持两种模式的网络连接:对等模式和客服端/服务器模式。其实,在现今的在线休闲游戏中,这两种模式都支持。
Raknet支持上述的两种模式。
 
在网络上,我们传输信息一般都是依靠TCP/IP协议的,而TCP/IP协议中传输信息的协议又包括TCP和UDP。
TCP是指的什么呢?它是指的面向连接的虚电路协议。也就是说,它在发送数据之前,要和用户建立连接,并一直保持和用户连接,然后发送数据,并不断询问用户是否收到正确的数据,如果不正确,就重发,直到正确为止。
UDP又是指的什么呢?它是指用户数据报协议,它在发送数据之前,先和用户建立连接,连接建立好以后,并不一直保持和用户的连接,然后发送数据,也不管对方是否收到数据,然后关闭连接。
从上面的描述可以看出TCP是相当可靠的一种连接方式,但它并不适合于游戏中。你可以想一下,如果一个玩家和服务器建立TCP连接,那么要等到这个用户断开和服务器的连接以后,其它用户才能使用服务器。这显然是不行的。
而UDP能做到和多个用户同时通信。例如,一个玩家要取得他的个人资料,然后他向服务器发出一个请求,服务器用UDP回答他,并关闭和他的连接;服务器然后就可以处理其他玩家的信息了。
 
我们在本例中要使用三个头文件:
 
RakClientInterface.h
RakNetworkFactory.h
RakServerInterface.h
 
第一个头文件包含了建立客服端所需要的信息,其中包括客服端的建立,连接和数据的发送和接收。
第二个头文件用于管理我们在程序中使用的类,包括类内存分配和类内存的释放。
第三个头文件用于建立服务器所需用的信息,包括服务器的建立,连接和数据的发送和接收。
 
char str[512];
RakClientInterface *rakClientInterface;
RakServerInterface *rakServerInterface;
 
str[512]是用来判断我们是要建立服务器还是客户端。接下来就声明一个客户端实例和一个服务器实例。
 
printf("(C)客服端 (S)服务器?n");
gets(str);
if (str[0]=='c')
{
       rakClientInter>
       rakServerInter>
       printf("客服端已经建立。");
}
else
{
       rakClientInter>
       rakServerInter>
    printf("服务器已经建立。");
    }
 
得到一个输入值,如果输入值为c,就建立客户端,然后将服务器实例设置为空,如果输入值为其它,就建立服务器,然后就将客户端实例设置为空。
 
RakNetworkFactory::GetRakClientInterface(); 初始化一个客户端实例,为它分配内存;
RakNetworkFactory::GetRakServerInterface(); 初始化一个服务器实例,为它分配内存;
 
最后,程序执行完成,我们就需要释放掉我们刚才分配的内存。
 
if (rakClientInterface)
       RakNetworkFactory::DestroyRakClientInterface(rakClientInterface);
else if (rakServerInterface)
       RakNetworkFactory::DestroyRakServerInterface(rakServerInterface);
 
完整的程序代码如下:
#include "stdio.h"
#include "conio.h"
#include "raknet/RakClientInterface.h"
#include "raknet/RakNetworkFactory.h"
#include "raknet/RakServerInterface.h"
 
int main(void)
{
char str[512];
RakClientInterface *rakClientInterface;
RakServerInterface *rakServerInterface;
 
printf("(C)客服端 (S)服务器?n");
gets(str);
if (str[0]=='c')
{
       rakClientInter>
       rakServerInter>
       printf("客服端已经建立。");
}
else
{
       rakClientInter>
       rakServerInter>
    printf("服务器已经建立。");
    }
 
// TODO - Add code body here
getch();
 
if (rakClientInterface)
       RakNetworkFactory::DestroyRakClientInterface(rakClientInterface);
else if (rakServerInterface)
       RakNetworkFactory::DestroyRakServerInterface(rakServerInterface);
return 0;
}
 
程序执行结果如图,你可以建立客户端或服务器:

 

 
 
关于更多内容请访问金桥科普网站( http://popul.jqcq.com  )游戏开发栏目,如你需要游戏开发方面的书籍请参考金桥书城游戏频道(http://book.jqcq.com/category/1_70_740.html )。 如果你在阅读本篇文章时有什么好的建议请来信给我,我的E_mail: akinggw@126.com. 如果你在使用SDL时有什么问题,请到金桥科普网站(http://popul.jqcq.com  )游戏开发栏目,我将详细地为你解答。
 
原创粉丝点击