文档章节

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

ProudNet
 ProudNet
发布于 2016/06/17 14:27
字数 1029
阅读 81
收藏 1

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中一直进行调用。

 

© 著作权归作者所有

ProudNet
粉丝 11
博文 9
码字总数 9624
作品 0
其它
私信 提问
【ProudNet】服务器引擎之艰难困苦的开发历程

摘要:游戏服务器开发,那些棘手的问题,是如何得到解决的? ProudNet 基于长时间技术积累和众多成功游戏产品和中国及全球范围运营经验 适用于各种复杂网络环境和多种游戏类型,简单易用即使...

ProudNet
2016/07/25
4K
9
一款高性能游戏服务器引擎的介绍ProudNet

ProudNet是一款游戏开发所需的服务器引擎。对于实时游戏处理通信量大和同时登录用户数多的问题,是在不同网络环境下能够保持其特有稳定性的高性能引擎。 通过视频教程l详细了解ProudNet游戏服...

ProudNet
2016/05/13
1K
1
【采访】韩国游戏服务器引擎开发公司 “Nettention”

在韩国有一个非常著名的游戏服务器引擎。 ● 对于游戏服务器来说经验很重要,那么你们拥有多少经验呢? 游戏服务器的开发始于1997年。我开创了利用Windows服务器的I/O Completion Port制造游...

ProudNet
2016/07/01
2.9K
15
两台设备时间同步round trip latency (RTT)方式介绍

在游戏开发过程中,会发现很多时候需要两台设备间时间同步进行的情况。 一般情况下,两台设备间时间同步使用round trip latency (RTT)方式 假设有A,B两台设备。 A->B:发送A的系统时间 [1] B-...

ProudNet
2016/05/19
564
0
游戏服务器引擎专场:11月28日上海站,11月30日北京站

游戏服务器开发,那些棘手的问题,是如何得到解决的? ProudNet 基于长时间技术积累和众多成功游戏产品和中国及全球范围运营经验,适用于各种复杂网络环境和多种游戏类型,简单易用即使缺少网...

ProudNet
2016/11/10
123
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
52分钟前
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部