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

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

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

Step1:

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

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

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

 Step2:

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

           否则链接会出错

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

Step3:

           最简单的服务器端程序

头文件 

[cpp]  view plain copy
  1. // MyChatServer.h  
  2. /************************************************************************ 
  3.   
  4.         FileName:MyChatServer.h 
  5.         Author    :eliteYang 
  6.         Mail    :elite_yang[at]163.com 
  7.         Desc    :服务器头文件 
  8.         TODO    :后面再进行整理 
  9.   
  10. ************************************************************************/  
  11. #ifndef __MY_CHAT_SERVER_H__  
  12. #define __MY_CHAT_SERVER_H__  
  13.    
  14. #pragma once  
  15.    
  16. #include <iostream>  
  17. #include "RakPeerInterface.h"   // RakNet Peer  
  18. #include "RakNetTypes.h"          
  19. #include "MessageIdentifiers.h" // RakNet自定义消息枚举定义处  
  20. #include "BitStream.h"          // RakNet消息包的Bit数据流  
  21.    
  22. #define MAX_CLIENTS 10  
  23. #define SERVER_PORT 60000  
  24.    
  25. enum ChatMessagesDefine  
  26. {// 自定义消息枚举值,消息ID  
  27.     MSG_CHATWORD = ID_USER_PACKET_ENUM + 1,        // 消息ID从RakNet定义的最后一个枚举开始  
  28. };  
  29.    
  30. #endif  

源文件

[cpp]  view plain copy
  1. // MyChatServer.cpp  
  2. #include "MyChatServer.h"  
  3. #include <string>  
  4. #include <iostream>  
  5. #include <sstream>  
  6. int main()  
  7. {  
  8.     //给服务器端创建一个实例  
  9.     RakNet::RakPeerInterface* pPeer = RakNet::RakPeerInterface::GetInstance();   
  10.     if ( NULL == pPeer )  
  11.     {  
  12.         std::cout << "RakNet::RakPeerInterface::GetInstance() Error!" << std::endl;  
  13.         return -1;  
  14.     }  
  15.     else  
  16.     {  
  17.         std::cout << "---------MyChatServer Init Success(C)-----------" << std::endl;  
  18.     }  
  19.   
  20.     RakNet::Packet* pPacket;  
  21.     std::cout << "Start Server ......" << std::endl;  
  22.     //启动服务器  
  23.     pPeer->Startup( MAX_CLIENTS, &RakNet::SocketDescriptor( SERVER_PORT, 0 ), 1 );  
  24.   
  25.   
  26.     //设置最大链接数  
  27.     pPeer->SetMaximumIncomingConnections( MAX_CLIENTS );  
  28.   
  29.     //  
  30.     while (1)  
  31.     {  
  32.         for ( pPacket = pPeer->Receive(); pPacket; pPeer->DeallocatePacket( pPacket ), pPacket = pPeer->Receive() )  
  33.         {  
  34.             switch ( pPacket->data[0] )  
  35.             {  
  36.             case ID_REMOTE_DISCONNECTION_NOTIFICATION:  
  37.                 std::cout << "Another client has disconnected" << std::endl;  
  38.                 break;  
  39.             case ID_REMOTE_CONNECTION_LOST:  
  40.                 std::cout << "Another client has lost the connection" << std::endl;  
  41.                 break;  
  42.             case ID_REMOTE_NEW_INCOMING_CONNECTION:  
  43.                 std::cout << "Another client has connected" << std::endl;  
  44.                 break;  
  45.             case ID_CONNECTION_REQUEST_ACCEPTED:  
  46.                 {  
  47.                     std::cout << "Our connection request has been accepted" << std::endl;  
  48.   
  49.                     RakNet::BitStream bsOut;  
  50.                     bsOut.Write( ( RakNet::MessageID )MSG_CHATWORD );  
  51.                     bsOut.Write("Hello world");  
  52.                     pPeer->Send( &bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, pPacket->systemAddress, false );  
  53.                 }  
  54.                 break;  
  55.             case ID_NEW_INCOMING_CONNECTION:  
  56.                 std::cout << "A connection is incoming" << std::endl;  
  57.                 break;  
  58.             case ID_NO_FREE_INCOMING_CONNECTIONS:  
  59.                 std::cout << "The server is full" << std::endl;  
  60.                 break;  
  61.             case ID_DISCONNECTION_NOTIFICATION:  
  62.                 std::cout << "A client has disconnected" << std::endl;  
  63.                 break;  
  64.             case ID_CONNECTION_LOST:  
  65.                 std::cout << "A client lost the connection" << std::endl;  
  66.                 break;  
  67.   
  68.             //用户自定义数据包  
  69.             case MSG_CHATWORD:  
  70.                 {  
  71.                     RakNet::RakString rs;  
  72.                     RakNet::BitStream bsIn( pPacket->data, pPacket->length, false );  
  73.                     bsIn.IgnoreBytes(sizeof(RakNet::MessageID));   
  74.                     bsIn.Read(rs);  //提取字符串           
  75.                     std::istringstream input_str(rs.C_String()); //存入字符串流  
  76.                     double v, h;  
  77.                     input_str >> v >> h; //提取想要的变量  
  78.                     std::cout << v << "  " << h << std::endl; //打印结果  
  79.                 }  
  80.                 break;  
  81.   
  82.             default:  
  83.                 std::cout << "Message with identifier %i has arrived" << pPacket->data[0] << std::endl;  
  84.                 break;  
  85.             }  
  86.         }  
  87.     }  
  88.   
  89.     //  
  90.     RakNet::RakPeerInterface::DestroyInstance( pPeer );  
  91.     return 0;  
  92. }  

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

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

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

double v, h;

从流中提取到变量里面


Step4:

          客户端

头文件

[cpp]  view plain copy
  1. #ifndef __MY_CLIENT_H__  
  2. #define __MY_CLIENT_H__  
  3.   
  4. #pragma once  
  5.   
  6. #include <iostream>  
  7. #include "RakPeerInterface.h"   // RakNet Peer  
  8. #include "RakNetTypes.h"          
  9. #include "MessageIdentifiers.h" // RakNet自定义消息枚举定义处  
  10. #include "BitStream.h"          // RakNet消息包的Bit数据流  
  11.   
  12. #define MAX_CLIENTS 10  
  13. #define SERVER_PORT 60000  
  14.   
  15. enum ChatMessagesDefine  
  16. {// 自定义消息枚举值,消息ID  
  17.     MSG_CHATWORD = ID_USER_PACKET_ENUM + 1,        // 消息ID从RakNet定义的最后一个枚举开始  
  18. };  
  19.   
  20. #endif  

源文件

[cpp]  view plain copy
  1. #include "MyClient.h"  
  2. #include <string>  
  3. #include <sstream>  
  4. #include <iostream>  
  5.   
  6.   
  7.   
  8. int main(void)  
  9. {  
  10.     double v = 1000.023;   
  11.     double h = 10023.23;  
  12.     RakNet::RakPeerInterface *peer = RakNet::RakPeerInterface::GetInstance();  
  13.   
  14.   
  15.     RakNet::SocketDescriptor sd;  
  16.     peer->Startup(1,&sd, 1);  
  17.   
  18.     //作为客户端连接,连接到主机ip地址和端口号  
  19.     peer->Connect("192.168.6.1", SERVER_PORT, 0, 0);  
  20.   
  21.     float k = 0;  
  22.     int i=0;  
  23.     for (i = 0; i < 10; i++)  
  24.     {  
  25.         //给主机发送数据  
  26.         RakNet::BitStream bsOut;  
  27.         bsOut.Write((RakNet::MessageID)MSG_CHATWORD);  
  28.         std::ostringstream format_messege;  
  29.         format_messege << v++ << " " << h++;  //输入信息到字符串流,用空格隔开,此处为飞行器速度高度V, h为double型      
  30. //      bsOut.Write("hello");     
  31.         bsOut.Write(format_messege.str().c_str());  
  32.         peer->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,RakNet::UNASSIGNED_SYSTEM_ADDRESS,true);  
  33.         Sleep(500);  
  34.     }  
  35.   
  36.   
  37.   
  38.     //断开连接,这个会给对方发送一个消息,告诉它要断开连接了。  
  39.     peer->Shutdown(300);   
  40.   
  41.     RakNet::RakPeerInterface::DestroyInstance(peer);  
  42.   
  43.     return 0;  
  44. }  

Step5:

        实验结果

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值