关于RakNet的一些入门的入门的总结

网上说这个是非常好的网络引擎,具体介绍请百度之

拿来研究了一番,发现资料比较少(除了官网的那些文档),例子也比较少

Step1:

           官网下载压缩包(还让填信息发邮件确认..orz...)

           解压缩以后,编译RakNet_VS2008.sln生成静态链接库(Static Lib)或者动态链接库(DLL),看各人喜好,

           我用的是StaticLib,生成了一个RakNet_VS2008_LibStatic_Debug_Win32.lib

 Step2:

           建立一个console工程(VS2010下),加入刚才的Lib,以及下载的头文件,注意还要加入ws2_32.lib

           否则链接会出错

           现在就基本完成了工程的配置了

Step3:

           最简单的服务器端程序

头文件

// MyChatServer.h
/************************************************************************
 
        FileName:MyChatServer.h
        Author    :eliteYang
        Mail    :elite_yang[at]163.com
        Desc    :服务器头文件
        TODO    :后面再进行整理
 
************************************************************************/
#ifndef __MY_CHAT_SERVER_H__
#define __MY_CHAT_SERVER_H__
 
#pragma once
 
#include <iostream>
#include "RakPeerInterface.h"   // RakNet Peer
#include "RakNetTypes.h"        
#include "MessageIdentifiers.h" // RakNet自定义消息枚举定义处
#include "BitStream.h"          // RakNet消息包的Bit数据流
 
#define MAX_CLIENTS 10
#define SERVER_PORT 60000
 
enum ChatMessagesDefine
{// 自定义消息枚举值,消息ID
    MSG_CHATWORD = ID_USER_PACKET_ENUM + 1,        // 消息ID从RakNet定义的最后一个枚举开始
};
 
#endif

源文件

// MyChatServer.cpp
#include "MyChatServer.h"
#include <string>
#include <iostream>
#include <sstream>
int main()
{
	//给服务器端创建一个实例
	RakNet::RakPeerInterface* pPeer = RakNet::RakPeerInterface::GetInstance(); 
	if ( NULL == pPeer )
	{
		std::cout << "RakNet::RakPeerInterface::GetInstance() Error!" << std::endl;
		return -1;
	}
	else
	{
		std::cout << "---------MyChatServer Init Success(C)-----------" << std::endl;
	}

	RakNet::Packet* pPacket;
	std::cout << "Start Server ......" << std::endl;
	//启动服务器
	pPeer->Startup( MAX_CLIENTS, &RakNet::SocketDescriptor( SERVER_PORT, 0 ), 1 );


	//设置最大链接数
	pPeer->SetMaximumIncomingConnections( MAX_CLIENTS );

	//
	while (1)
	{
		for ( pPacket = pPeer->Receive(); pPacket; pPeer->DeallocatePacket( pPacket ), pPacket = pPeer->Receive() )
		{
			switch ( pPacket->data[0] )
			{
			case ID_REMOTE_DISCONNECTION_NOTIFICATION:
				std::cout << "Another client has disconnected" << std::endl;
				break;
			case ID_REMOTE_CONNECTION_LOST:
				std::cout << "Another client has lost the connection" << std::endl;
				break;
			case ID_REMOTE_NEW_INCOMING_CONNECTION:
				std::cout << "Another client has connected" << std::endl;
				break;
			case ID_CONNECTION_REQUEST_ACCEPTED:
				{
					std::cout << "Our connection request has been accepted" << std::endl;

					RakNet::BitStream bsOut;
					bsOut.Write( ( RakNet::MessageID )MSG_CHATWORD );
					bsOut.Write("Hello world");
					pPeer->Send( &bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, pPacket->systemAddress, false );
				}
				break;
			case ID_NEW_INCOMING_CONNECTION:
				std::cout << "A connection is incoming" << std::endl;
				break;
			case ID_NO_FREE_INCOMING_CONNECTIONS:
				std::cout << "The server is full" << std::endl;
				break;
			case ID_DISCONNECTION_NOTIFICATION:
				std::cout << "A client has disconnected" << std::endl;
				break;
			case ID_CONNECTION_LOST:
				std::cout << "A client lost the connection" << std::endl;
				break;

			//用户自定义数据包
			case MSG_CHATWORD:
				{
					RakNet::RakString rs;
					RakNet::BitStream bsIn( pPacket->data, pPacket->length, false );
					bsIn.IgnoreBytes(sizeof(RakNet::MessageID)); 
					bsIn.Read(rs);	//提取字符串			
					std::istringstream input_str(rs.C_String()); //存入字符串流
					double v, h;
					input_str >> v >> h; //提取想要的变量
					std::cout << v << "  " << h << std::endl; //打印结果
				}
				break;

			default:
				std::cout << "Message with identifier %i has arrived" << pPacket->data[0] << std::endl;
				break;
			}
		}
	}

	//
	RakNet::RakPeerInterface::DestroyInstance( pPeer );
	return 0;
}

说明:提取到的第一个部分是固定的消息类型

然后是一个字符串,我把它放入字符串流istringstream,方便之后提取各种类型(多为浮点)

比如以飞行器的速度高度为例,定义为

double v, h;

从流中提取到变量里面


Step4:

          客户端

头文件

#ifndef __MY_CLIENT_H__
#define __MY_CLIENT_H__

#pragma once

#include <iostream>
#include "RakPeerInterface.h"   // RakNet Peer
#include "RakNetTypes.h"        
#include "MessageIdentifiers.h" // RakNet自定义消息枚举定义处
#include "BitStream.h"          // RakNet消息包的Bit数据流

#define MAX_CLIENTS 10
#define SERVER_PORT 60000

enum ChatMessagesDefine
{// 自定义消息枚举值,消息ID
	MSG_CHATWORD = ID_USER_PACKET_ENUM + 1,        // 消息ID从RakNet定义的最后一个枚举开始
};

#endif

源文件

#include "MyClient.h"
#include <string>
#include <sstream>
#include <iostream>



int main(void)
{
	double v = 1000.023; 
	double h = 10023.23;
	RakNet::RakPeerInterface *peer = RakNet::RakPeerInterface::GetInstance();


	RakNet::SocketDescriptor sd;
	peer->Startup(1,&sd, 1);

	//作为客户端连接,连接到主机ip地址和端口号
	peer->Connect("192.168.6.1", SERVER_PORT, 0, 0);

	float k = 0;
	int i=0;
	for (i = 0; i < 10; i++)
	{
		//给主机发送数据
		RakNet::BitStream bsOut;
		bsOut.Write((RakNet::MessageID)MSG_CHATWORD);
		std::ostringstream format_messege;
		format_messege << v++ << " " << h++;	//输入信息到字符串流,用空格隔开,此处为飞行器速度高度V, h为double型	
//		bsOut.Write("hello");	
		bsOut.Write(format_messege.str().c_str());
		peer->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,RakNet::UNASSIGNED_SYSTEM_ADDRESS,true);
		Sleep(500);
	}



	//断开连接,这个会给对方发送一个消息,告诉它要断开连接了。
	peer->Shutdown(300); 

	RakNet::RakPeerInterface::DestroyInstance(peer);

	return 0;
}

Step5:

        实验结果

分别为客户端发来的v, h变量的数值


  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。   Radnet有以下特点:   l 高性能 在同一台计算机上,Raknet可以实现在两个程序之间每秒传输25,000条信息;   l 容易使用 Radnet有在线用户手册,视频教程。每一个函数和类都有详细的讲解,每一个功能都有自己的例程;   l 跨平台,当前Radnet支持Windows, Linux, Macs,可以建立在Visual Studio, GCC, Code: Blocks, DevCPP 和其它平台上;   l 在线技术支持 RakNet有一个活跃的论坛,邮件列表,你只要给他们发信,他们可以在几小时之内回复你。   l 安全的传输 RakNet在你的代码中自动使用SHA1, AES128, SYN,用RSA避免传输受到攻击   l 音频传输 用Speex编码解码,8位的音频只需要每秒500字节传输。   l 远程终端 用RakNet,你能远程管理你的程序,包括程序的设置,密码的管理和日志的管理。   l 目录服务器 目录服务器允许服务器列举他们自己需要的客户端,并与他们连接。   l Autopatcher Autopatcher系统将限制客户端传输到服务端的文件,这样是为了避免一些不合法的用户将一些不合法的文件传输到服务端。   l 对象重载系统   l 网络数据压缩 BitStream类允许压缩矢量,矩阵,四元数和在-1到1之间的实数。   l 远程功能调用   l 强健的通信层 可以保障信息按照不同的信道传输   RakNet支持两种版权,如果你是做免费游戏,RakNet将是免费的。相反,你必须支付一定的费用。   从这里你可以下载到最新的RakNet:   http://www.rakkarsoft.com/raknet/downloads/RakNet.zip   例子:   #include   #include   #include   #include "RakClientInterface.h" //建立客服端所需要的信息,其中包括客服端的建立,连接和数据的发送和接收   #include "RakNetworkFactory.h" //用于管理我们在程序中使用的类,包括类内存分配和类内存的释放   #include "RakServerInterface.h" //用于建立服务器所需用的信息,包括服务器的建立,连接和数据的发送和接收   #include "PacketEnumerations.h" //用于处理网络引擎在运行过程中得到的信息   Packet *packet;//网络传输中用于存储数据的一个数据结构   /////////////////////////////////////////////////////   /*   Struct Packet   {   PlayerID playerId; //表明了包的出处。每一个连接服务器的客户端都将被分配一个唯一的ID号,用于标识自己。   Unsigned long length; //数据长度   Unsigned long bitsize; //比特大小   Char *data; //包中的数据   }   */   /////////////////////////////////////////////////////   int main(void)   {   char str[512];   RakClientInterface *rakClientInterface;   RakServerInterface *rakServerInterface;   printf("(C)客服端 (S)服务器?\n");   gets(str);   if (str[0]=='c')   {   rakClientInterface=RakNetworkFactory::GetRakClientInterface();//初始化一个客户端实例,为它分配内存   rakServerInterface=0;   printf("客服端已经建立。");   }   else   {   rakClientInterface=0;   rakServerInterface=RakNetworkFactory::GetRakServerInterface();//初始化一个服务器实例,为它分配内存   printf("服务器已经建立。");   }   if (rakServerInterface)   {  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值