raknet android,RakNet入门介绍

#include "../RakNet/src/RakPeerInterface.h"

#include "../RakNet/src/RakNetTypes.h"

#include "../RakNet/src/MessageIdentifiers.h"

#include "../RakNet/src/BitStream.h"

#include "../RakNet/src/RakString.h"

#include "../RakNet/src/StringCompressor.h"

int StartServer();

int StartClient(void* param);

//测试下RakNet

void main(int argc, char* argv[]) {

PTHREAD pThread = 0;

RakNet::RakPeerInterface* peer = RakNet::RakPeerInterface::GetInstance();

if (!peer)

{

LogUtils::e(LOG_TAG, "main get peer failed.");

system("pause");

return;

}

LogUtils::i(LOG_TAG, "(C)客服端 (S)服务器?");

char str = getchar();

if (str == 'c')

{

StartClient(NULL);

//PlatformAbstract::CreateThread(pThread, (THREADPROCTYPE)&StartClient, NULL);

LogUtils::e(LOG_TAG, "::main 客服端已经建立。");

}

else

{

StartServer();

//PlatformAbstract::CreateThread(pThread, (THREADPROCTYPE)&StartServer, NULL);

LogUtils::e(LOG_TAG, "::main 服务器已经建立。");

}

system("pause");

}

这里是一个测试方法 可以直接放到测试工程中测试

int StartServer() {

//给服务器端创建一个实例

RakNet::RakPeerInterface* pPeer = RakNet::RakPeerInterface::GetInstance();

if (NULL == pPeer)

{

LogUtils::e(LOG_TAG, "TestFunc get pPeer failed.");

return -1;

}

else

{

LogUtils::e(LOG_TAG, "::TestFunc ---------MyChatServer Init Success(C)-----------");

}

RakNet::Packet* pPacket;

LogUtils::i(LOG_TAG, "::TestFunc Start Server .....");

//启动服务器

RakNet::SocketDescriptor sd = RakNet::SocketDescriptor(6000, 0);

RakAssert(RakNet::RAKNET_STARTED == pPeer->Startup(1, &sd, 1));

//设置最大链接数

pPeer->SetMaximumIncomingConnections(1);

auto boundAddress = pPeer->GetMyBoundAddress();

const char* sAddr = boundAddress.ToString();

LogUtils::e(LOG_TAG, "::StartServer sAddr: %s", sAddr);

//

while (1)

{

for (pPacket = pPeer->Receive(); pPacket; pPeer->DeallocatePacket(pPacket), pPacket = pPeer->Receive())

{

LogUtils::e(LOG_TAG, "StartServer pPacket type: %d", pPacket->data[0]);

switch (pPacket->data[0])

{

case ID_REMOTE_DISCONNECTION_NOTIFICATION: {

LogUtils::e(LOG_TAG, "StartServer Another client has disconnected");

}break;

case ID_REMOTE_CONNECTION_LOST: {

LogUtils::i(LOG_TAG, "StartServer ID_REMOTE_CONNECTION_LOST");

}break;

case ID_REMOTE_NEW_INCOMING_CONNECTION: {

LogUtils::i(LOG_TAG, "StartServer ID_REMOTE_CONNECTION_LOST");

RakNet::BitStream bs;

bs.Write < RakNet::MessageID>(ServerConnectBack);

RakNet::StringCompressor::Instance()->EncodeString(pPacket->systemAddress.ToString(true), 255, &bs);

}break;

//client端调用Connect后收到的server响应

case ID_CONNECTION_REQUEST_ACCEPTED: {

LogUtils::i(LOG_TAG, "StartServer ID_CONNECTION_REQUEST_ACCEPTED");

RakNet::BitStream bsOut;

bsOut.Write((RakNet::MessageID)ID_USER_PACKET_ENUM + 1);

bsOut.Write("Server Say Hello.");

pPeer->Send(&bsOut, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0, pPeer->GetMyBoundAddress(), false);

}break;

//server端收到来自client的Connect

case ID_NEW_INCOMING_CONNECTION: {

LogUtils::e(LOG_TAG, "StartServer ID_NEW_INCOMING_CONNECTION");

}break;

case ID_NO_FREE_INCOMING_CONNECTIONS: {

LogUtils::e(LOG_TAG, "StartServer ID_NO_FREE_INCOMING_CONNECTIONS");

}break;

case ID_DISCONNECTION_NOTIFICATION: {

LogUtils::e(LOG_TAG, "StartServer ID_DISCONNECTION_NOTIFICATION");

}break;

case ID_CONNECTION_LOST: {

LogUtils::e(LOG_TAG, "StartServer ID_CONNECTION_LOST");

}break;

case ID_CONNECTION_ATTEMPT_FAILED: {

LogUtils::e(LOG_TAG, "StartServer ID_CONNECTION_ATTEMPT_FAILED");

}break;

//用户自定义数据包

case ID_USER_PACKET_ENUM + 1:

{

LogUtils::e(LOG_TAG, "StartServer recv ID_USER_PACKET_ENUM + 1: %d", ID_USER_PACKET_ENUM + 1);

RakNet::RakString rs1, rs2;

RakNet::BitStream bsIn(pPacket->data, pPacket->length, false);

bsIn.IgnoreBytes(sizeof(RakNet::MessageID));

//bsIn.Read(rs); //提取字符串

RakNet::StringCompressor::Instance()->DecodeString(&rs1, 255, &bsIn);

RakNet::StringCompressor::Instance()->DecodeString(&rs2, 255, &bsIn);

LogUtils::e(LOG_TAG, "::StartServer Recv User Data: %s %s %s", pPacket->systemAddress.ToString(true, '|'), rs1.C_String(), rs2.C_String());

}

break;

default: {

LogUtils::i(LOG_TAG, "::TestFunc Message with identifier %i has arrived", pPacket->data[0]);

}break;

}

}

sleep(100);

}

//

RakNet::RakPeerInterface::DestroyInstance(pPeer);

}

int StartClient(void* param) {

//获取RakNetPeer接口

RakNet::RakPeerInterface* peer = RakNet::RakPeerInterface::GetInstance();

if (!peer)

{

LogUtils::e(LOG_TAG, "::StartClient get peer failed.");

return 0;

}

RakNet::SocketDescriptor sd = RakNet::SocketDescriptor(0, 0);

RakAssert(RakNet::RAKNET_STARTED == peer->Startup(1, &sd, 1));

LogUtils::i(LOG_TAG, "::StartClient get peer success");

RakAssert(RakNet::CONNECTION_ATTEMPT_STARTED == peer->Connect("127.0.0.1", 6000, 0, 0, 0, 0));

while (peer->IsActive())

{

//开始发包了

LogUtils::i(LOG_TAG, "::StartClient %d 发包", GetTickCount());

RakNet::BitStream bIn;

bIn.Write<:messageid>(ID_USER_PACKET_ENUM + 1);

RakNet::StringCompressor::Instance()->EncodeString("Client Say Hello", 255, &bIn);

RakNet::StringCompressor::Instance()->EncodeString("Client Say NMH", 255, &bIn);

//注意broadcast参数 如果是true,则发广播,systemidentifier表示不发送地址,一般使用常量 RakNet::UNASSIGNED_SYSTEM_ADDRESS

//如果是false,则往systemidentifier指定的ip和端口处发送

//如果发包是有序的,则channel指定了信道,同一信道的具有递增的排序值,避免有多种有序消息的排序值相互干扰

uint32_t sendrs = peer->Send(&bIn, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0, RakNet::SystemAddress("127.0.0.1", 6000), false);

LogUtils::e(LOG_TAG, "StartClient sendres: %d", sendrs);

Sleep(1000);

}

peer->Shutdown(1000);

RakNet::RakPeerInterface::DestroyInstance(peer);

peer = NULL;

LogUtils::e(LOG_TAG, "Disconnect from Server. StartClient peer closed");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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)   {  

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值