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

原创 2006年06月22日 11:35:00
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  )游戏开发栏目,我将详细地为你解答。
 

Unity 2D游戏开发快速入门(内部资料)

Unity 2D游戏开发快速入门(内部资料) 试读样张:http://pan.baidu.com/s/1hqh5oqw Unity 2D游戏开发快速入门4 ...
  • u014621518
  • u014621518
  • 2014年08月19日 15:57
  • 1296

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

2D网络游戏开发(网络篇)(一) 来源: ChinaUnix博客  日期: 2006.05.26 11:16 (共有0条评论) 我要评论 作者:akinggw“2D网游开发”,我有时都觉得这个标题包含...
  • Aaronzzq
  • Aaronzzq
  • 2011年04月07日 12:07
  • 962

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

2D网络游戏开发(网络篇)(二) 作者:akinggw在上一章中,我简单的讲解了什么是Raknet,它有那些好处。在这一章中,我们将讲解如何在IDE中配置Raknet,并将测试一个程序。由于Rakne...
  • akinggw
  • akinggw
  • 2006年06月22日 11:34
  • 2313

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

2D网络游戏开发(网络篇)(九) 作者:akinggw 前言 转眼之间,就来到了这一系列教程的第九课来了,事先声明一下,这些文章大多来源于raknet的官方网站或者例程。如果你觉得我的文章有地方看不懂...
  • akinggw
  • akinggw
  • 2006年06月22日 11:44
  • 1518

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

2D网络游戏开发(网络篇)(四) 作者:akinggw 在上一篇中,我们只是讲解了如何建立一个服务器或客户端。这一篇中,我们将讲解客户端如何和服务器进行连接。 #include "stdio.h" /...
  • akinggw
  • akinggw
  • 2006年06月22日 11:36
  • 1625

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

autoPatcher.SetNetworkingSystem(rakPeer); SetNetworkingSystem函数的原型如下: void SetNetworkingSystem (RakP...
  • akinggw
  • akinggw
  • 2006年06月22日 11:42
  • 927

2D网络游戏开发(网络篇)(八)1

2D网络游戏开发(网络篇)(八) 作者:akinggw 前言 已经写到raknet编程的第八篇了,在前面的内容当中,我们讲解了raknet如何传输普通的信息,可光是这些是不够的。因为一个游戏不可能就只...
  • akinggw
  • akinggw
  • 2006年06月22日 11:43
  • 919

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

2D网络游戏开发(网络篇)(六) 作者:akinggw 在前面的章节中,我们实现了一个简单的聊天室。今天,我们仍然要围绕这个主题,但采取别的方法,这个方法很有用,应该说是整个网络引擎的关键,它就是――...
  • akinggw
  • akinggw
  • 2006年06月22日 11:38
  • 868

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

#pragma pack(1)struct C   //结构C的类型和结构A的类型一样{ A a; B b;}#pragma pack(1)struct D      //结构C的类型和结构A的类型一...
  • akinggw
  • akinggw
  • 2006年06月22日 11:44
  • 1509

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

2D网络游戏开发(网络篇)(五) 作者:akinggw 在第四篇中,我们学习了如何使用raknet进行服务器和客户端的连接,在这一篇中,我们将讲解如何让客户端和服务器进行通信,比如说聊天。好吧,其实我...
  • akinggw
  • akinggw
  • 2006年06月22日 11:37
  • 1090
收藏助手
不良信息举报
您举报文章:2D网络游戏开发(网络篇)(三)
举报原因:
原因补充:

(最多只允许输入30个字)