星运 发表于 2016-9-7 12:17:21

ProudNet使用方法#1:服务器-客户端连接

ProudNet是研究游戏软件开发的游戏服务端 &网络引擎。

1.服务器生成
CNetServer 实例生成后,调用Start。

1.
2.CNetServer* s = CNetServer::Create(); //    
3.param.m_tcpPorts.Add(44444); //    
4.param.m_udpPorts.Add(44444);
5.param.m_protocolVersion = Guid({ 0x5dca93f4, 0x8133, 0x44a0,   
6.    { 0xb5, 0x7b, 0x75, 0x7d, 0x9c, 0x78, 0xd5, 0x2e } }); //    
7.   
8.s->Start(param);   
9.
10.
11.NetServer s= new NetServer(); //       
12.param.tcpPorts.Add(44444); //       
13.param.udpPorts.Add(44444);
14.param.protocolVersion = Guid.From({...}); // 与 一致   
15.s.Start(param);

: 实例生成
: 指定服务器侦听端口
: 制定协议版本,客户端必须连接同一版本,为保证客户端与服务器间的统一。

2.客户端连接服务器
CNetServer 实例生成后, 调用Connect.

1.
2.CNetClient* c = CNetClient::Create();      
3.param.m_serverAddr = _PNT("my.game.com"); //       
4.param.m_serverPort = 44444;      
5.param.m_protocolVersion = Guid(...); // 与一致   
6.c->Connect(param);   
7.
8.
9.NetClient c = new NetClient();      
10.param.serverAddr = "my.game.com";   //
11.param.serverPort = 44444;      
12.param.protocolVersion = Guid.From({...}); //与 一致      
13.c.Connect(param);

:连接服务器的信息。还有很多选项再次不详细说明。
以上函数立即返回,连接服务器的过程在后台进行,即非同期函数。ProudNet 内的大部分函数都是异步进行。客户端必须能够检测到结束连接到服务器的过程事件,当这些事件发生时,执行想要运行的代码。如下图所示。

1.
2.c->Set_OnJoinServerComplete([...](ErrorInfo* result) {   //
3.if(result->m_errorType == ErrorType_Ok) {   
4.      ... // 处理成功
5.   }   
6.    else {   
7.      print(result->ToString());   
8.   ... // 处理失败
9.    }   
10.});   
11.
12.c.JoinServerCompleteHandler = (result)=>{   
13.    if(result.m_errorType == ErrorType.Ok) {   
14.      ... // 处理成功
15.    }   
16.    else {   
17.      print(result.ToString());   
18.      ... // 处理失败   
19.    }   
20.};


代表 Lambda capture 里是否要进行外部变数复制还是添加声明的部分,详细请参考c++部分。
同时,服务器监测客户端进入,如下所示。

1.
2.s->Set_OnClientJoin([...](CNetClientInfo* info) {      
3.    // info中包含新客户端信息
4.    ...   
5.});   
6.
7.
8.s.ClientJoinHandler = (info) {   
9.    // info中包含新客户端信息   
10.    ...      
11.};

以上info中包括HostID. HostID是连接到服务器的每个客户端的唯一整数型值,当然这个值不会分配给多个客户端,服务器分配到固定的HostID_Server值。
大多数的游戏客户端不处理多线程事件或者消息,以此客户端接收数据处理以上事件的话必将调用某个函数,以下是调用方法。

1.
2.c->FrameMove();   
3.
4.
5.
6.c.FrameMove();

服务器基本上都是一个多线程池,所以不调用FrameMove()也可行。当然,服务器也有单一线程功能,还有许多线程方式在此不做详细介绍。

3.服务器-客户端断开连接。
客户端想断开连接须引用 NetClient.Disconnect()。
拔掉网线或者强制终止进程也可中断连接,以此客户端要进行监测。如以下代码。

1.
2.c->Set_OnLeaveServer([...](ErrorInfo* reason) {   
3.    //Reason 中 包含了为什么断开的信息。
4.    ...   
5.});   
6.
7.
8.c.LeaveServerHandler = (reason)=>{   
9.    //Reason 中 包含了为什么断开的信息。
10.    ...   
11.};

所以服务器要监测客户端是否断开连接。参考以下
1.
2.s->Set_OnClientLeave([...](CNetClientInfo* client,   //
3.    ErrorInfo* reason,   
4.    const ByteArray& comment) {   
5.    //在此添事件处理代码
6.});   
7.
8.
9.s.ClientLeaveHandler = (client,reason,comment)=>{    //
10.    //在此添事件处理代码
11.};

在 client 中包含了退出客户端的信息。
Reason 中 包含了为什么退出的信息。
Comment 中包含了调用断开连接函数时的使用者定义的信息。
以上所讲述的是服务器与客户端之间的连接与断开过程。

总结:

1. NetServer实例生成后, 开始调用。
2. NetClient 实例生成后, 调用Connect.
3. NetServer.OnClientJoin, OnClientLeave中处理客户端的进出记录。
4. NetClient.OnJoinServerComplete,OnLeaveServer中处理服务器的连接成功、失败、中间连接断。
5. NetClient.FrameMove中一直进行调用。

三妮 发表于 2016-9-9 15:43:13

其实我是看不懂的~~~~~~~~~~~

三妮 发表于 2016-9-12 11:20:38

还是希望对喜欢游戏开发的人有帮助

三妮 发表于 2016-9-13 11:30:06

ProudNet是研究游戏软件开发的游戏服务端 &网络引擎。

三妮 发表于 2016-9-14 11:27:52

把看帖回帖的美德发扬光大 嘿嘿

三妮 发表于 2016-9-15 10:38:44

感谢lt给我们提供了这么好的交流平台

三妮 发表于 2016-9-16 10:21:10

lz不易 还请大家多多关照

三妮 发表于 2016-9-19 08:49:20

放假也宅在家里玩游戏了的举手

三妮 发表于 2016-9-20 09:29:48

上学的时候就没学好计算机 现在看这些字符还是迷糊

三妮 发表于 2016-9-21 12:16:58

好像和电脑有关的我都没什么天赋……
页: [1] 2
查看完整版本: ProudNet使用方法#1:服务器-客户端连接