ProudNet 介绍 ProudNet是研究游戏软件开发的游戏服务端 &网络引擎。
1.服务器生成 CNetServer 实例生成后,调用Start。
1.[C++] 2.CNetServer* s = CNetServer::Create(); // [1] 3.param.m_tcpPorts.Add(44444); // [2] 4.param.m_udpPorts.Add(44444); 5.param.m_protocolVersion = Guid({ 0x5dca93f4, 0x8133, 0x44a0, 6. { 0xb5, 0x7b, 0x75, 0x7d, 0x9c, 0x78, 0xd5, 0x2e } }); // [3] 7. 8.s->Start(param); 9. 10.[C#] 11.NetServer s= new NetServer(); // [1] 12.param.tcpPorts.Add(44444); // [2] 13.param.udpPorts.Add(44444); 14.param.protocolVersion = Guid.From({...}); // 与 [3]一致 15.s.Start(param);
[1]: 实例生成 [2]: 指定服务器侦听端口 [3]: 制定协议版本,客户端必须连接同一版本,为保证客户端与服务器间的统一。
2.客户端连接服务器 CNetServer 实例生成后, 调用Connect.
1.[C++] 2.CNetClient* c = CNetClient::Create(); 3.param.m_serverAddr = _PNT("my.game.com"); // [4] 4.param.m_serverPort = 44444; 5.param.m_protocolVersion = Guid(...); // 与[3]一致 6.c->Connect(param); 7. 8.[C#] 9.NetClient c = new NetClient(); 10.param.serverAddr = "my.game.com"; //[4] 11.param.serverPort = 44444; 12.param.protocolVersion = Guid.From({...}); //与 [3]一致 13.c.Connect(param);
[4]:连接服务器的信息。还有很多选项再次不详细说明。 以上函数立即返回,连接服务器的过程在后台进行,即非同期函数。ProudNet 内的大部分函数都是异步进行。客户端必须能够检测到结束连接到服务器的过程事件,当这些事件发生时,执行想要运行的代码。如下图所示。
1.[C++] 2.c->Set_OnJoinServerComplete([...](ErrorInfo* result) { // [5] 3. if(result->m_errorType == ErrorType_Ok) { 4. ... // 处理成功 5. } 6. else { 7. print(result->ToString()); 8. ... // 处理失败 9. } 10.}); 11.[C#] 12.c.JoinServerCompleteHandler = (result)=>{ 13. if(result.m_errorType == ErrorType.Ok) { 14. ... // 处理成功 15. } 16. else { 17. print(result.ToString()); 18. ... // 处理失败 19. } 20.};
[5]代表 Lambda capture 里是否要进行外部变数复制还是添加声明的部分,详细请参考c++部分。 同时,服务器监测客户端进入,如下所示。
1.[C++] 2.s->Set_OnClientJoin([...](CNetClientInfo* info) { 3. // info中包含新客户端信息 4. ... 5.}); 6. 7.[C#] 8.s.ClientJoinHandler = (info) { 9. // info中包含新客户端信息 10. ... 11.};
以上info中包括HostID. HostID是连接到服务器的每个客户端的唯一整数型值,当然这个值不会分配给多个客户端,服务器分配到固定的HostID_Server值。 大多数的游戏客户端不处理多线程事件或者消息,以此客户端接收数据处理以上事件的话必将调用某个函数,以下是调用方法。
1.[C++] 2.c->FrameMove(); 3. 4. 5.[C#] 6.c.FrameMove();
服务器基本上都是一个多线程池,所以不调用FrameMove()也可行。当然,服务器也有单一线程功能,还有许多线程方式在此不做详细介绍。
3.服务器-客户端断开连接。 客户端想断开连接须引用 NetClient.Disconnect()。 拔掉网线或者强制终止进程也可中断连接,以此客户端要进行监测。如以下代码。
1.[C++] 2.c->Set_OnLeaveServer([...](ErrorInfo* reason) { 3. //Reason 中 包含了为什么断开的信息。 4. ... 5.}); 6. 7.[C#] 8.c.LeaveServerHandler = (reason)=>{ 9. //Reason 中 包含了为什么断开的信息。 10. ... 11.};
所以服务器要监测客户端是否断开连接。参考以下 1.[C++] 2.s->Set_OnClientLeave([...](CNetClientInfo* client, //[1] 3. ErrorInfo* reason, 4. const ByteArray& comment) { 5. //在此添事件处理代码 6.}); 7. 8.[C#] 9.s.ClientLeaveHandler = (client,reason,comment)=>{ //[1] 10. //在此添事件处理代码 11.};
在 [1]client 中包含了退出客户端的信息。 Reason 中 包含了为什么退出的信息。 Comment 中包含了调用断开连接函数时的使用者定义的信息。 以上所讲述的是服务器与客户端之间的连接与断开过程。
总结:
1. NetServer实例生成后, Start调用。 2. NetClient 实例生成后, 调用Connect. 3. NetServer.OnClientJoin, OnClientLeave中处理客户端的进出记录。 4. NetClient.OnJoinServerComplete, OnLeaveServer中处理服务器的连接成功、失败、中间连接断开。 5. NetClient.FrameMove中一直进行调用。 |
转载于:https://my.oschina.net/ProudNet/blog/693442