GDNet 的Send和SendRT,SendERT,SendERTP,AddOperation使用介绍
有学习的伙伴们,有的会不知道什么使用Send和SendRT,SendERT,SendERTP,AddOperation的方法, 这几个方法是GDNet框架的主要方法,必须要会使用哦!
我在这里就给学习的伙伴们详细讲下Send和SendRT,SendERT,SendERTP,AddOperation方法的使用。
服务器的Send方法:
Send方法是客户端与服务器通讯的方式之一
Send方法的第一个参数client:参数client为客户端的对象, 也就是你要给client发送数据,服务器上的client是成千上万个的,当哪个client客户端发送数据给服务器,服务器都会取到对应的client对象,你很方便就可以使用client作为Send的第一个参数
Send方法的第二个参数cmd:这个cmd为网络命令(指令),cmd网络必须参考NetCmd指令类来定义和传参,你可以添加自己的代码指令,添加指令之后,必须在对方进行处理, 比如客户端Send, 你就要在服务器解析。 如果是服务器Send, 你就要在客户端解析
Send方法的第三个参数func:function参数为指定调用远程端的函数名称, 如果客户端Send, 服务器必须要有func字符串指定的函数, 比如客户端Send("Test"); 那么服务器必须要有void Test()方法接收,Test方法加上[Rpc]特性即可
Send方法的第四个参数pars:pars参数是远程函数的参数对象, pars参数必须要指定对远程机器端的真实参数,如果指定参数不一致或者不匹配,都会调用失败。(pars参数不能传入基于unity的Object类的对象,在unity中只能使用少数的结构体类型, 如Vector2,3,4, Rect, Color....)
SendRT方法:
SendRT方法是实现了Udp协议的可靠传输功能,例如客户端SendRT一个网络数据,服务器没有收到,丢包了,那么客户端会在1秒后再次发送第2个数据包,如果还是没有收到,则再次进行发送第3,4...个包,当发送到30个包后还是丢包的话,那么可靠传输就会停止发送,同时也宣布可靠传输发送失败! 那么如果服务器收到数据呢? 如果服务器收到数据后,会回调(发送确认数据给客户端),这样客户端就会知道,这个数据包服务器已经收到, 那么如果服务器发送下来的数据丢失了呢?如果服务器发送的数据丢失的话,客户端还是会按照前面说的那样,一直发送数据给客户端,知道30次后依然没有回调,则提示可靠失败。
SendRT方法的client参数:参数client为客户端的对象, 也就是你要给client发送数据,服务器上的client是成千上万个的,当哪个client客户端发送数据给服务器,服务器都会取到对应的client对象,你很方便就可以使用client作为Send的第一个参数
SendRT方法的cmd参数:参数cmd跟Send方法有点不一样,只能使用两种枚举类型, 在服务器类里面调用 或 在客户端类里面调用。 如果客户端SendRT的cmd = RTCmd.PublicRT, 就会在服务器类调用, 如果SendRT的cmd = RTCmd.EntityRT就会在NetPlayer派生类里面调用,也就是你自己定义的Player类。
SendRT方法的func参数:function参数为指定调用远程端的函数名称, 如果客户端Send, 服务器必须要有func字符串指定的函数, 比如客户端Send("Test"); 那么服务器必须要有void Test()方法接收,Test方法加上[Rpc]特性即可
SendRT方法的pars参数:pars参数是远程函数的参数对象, pars参数必须要指定对远程机器端的真实参数,如果指定参数不一致或者不匹配,都会调用失败。(pars参数不能传入基于unity的Object类的对象,在unity中只能使用少数的结构体类型, 如Vector2,3,4, Rect, Color....)
SendERT方法:
SendERT方法为实体可靠传输, SendERT方法可以发送一个大文件数据,而且还带有func方法pars参数进行解释buffer里面的字节数组内容,这个SendERT方法是SendRT方法的升级版。
SendERT方法的client参数:参数client为客户端的对象, 也就是你要给client发送数据,服务器上的client是成千上万个的,当哪个client客户端发送数据给服务器,服务器都会取到对应的client对象,你很方便就可以使用client作为Send的第一个参数
SendERT方法的cmd参数:参数cmd跟Send方法有点不一样,只能使用两种枚举类型, 在服务器类里面调用 或 在客户端类里面调用。 如果客户端SendRT的cmd = RTCmd.PublicRT, 就会在服务器类调用, 如果SendRT的cmd = RTCmd.EntityRT就会在NetPlayer派生类里面调用,也就是你自己定义的Player类。
SendERT方法的progress参数:progress参数为发送大文件数据时的进度值,进度值是委托方法,可以监听当前发送的进度和状态,如果状态可靠失败,状态会变成失败状态,如果发送成功,则会是成功状态。
SendERT方法的func参数:function参数为指定调用远程端的函数名称, 如果客户端Send, 服务器必须要有func字符串指定的函数, 比如客户端Send("Test"); 那么服务器必须要有void Test()方法接收,Test方法加上[Rpc]特性即可
SendERT方法的pars参数:pars参数是远程函数的参数对象, pars参数必须要指定对远程机器端的真实参数,如果指定参数不一致或者不匹配,都会调用失败。(pars参数不能传入基于unity的Object类的对象,在unity中只能使用少数的结构体类型, 如Vector2,3,4, Rect, Color....)
SendERTP方法:
下图SendERTP方法参数有点多! SendERTP是SendERT的升级版,
SendERTP方法可以通知远程机器的进度值,告诉远程机器的当前下载进度,比如我们使用的浏览器下载文件,是不是知道下载文件的进度? 这个方法就是处理下载文件这样的功能。
SendERTP方法的client参数:参数client为客户端的对象, 也就是你要给client发送数据,服务器上的client是成千上万个的,当哪个client客户端发送数据给服务器,服务器都会取到对应的client对象,你很方便就可以使用client作为Send的第一个参数
SendERTP方法的cmd参数:参数cmd跟Send方法有点不一样,只能使用两种枚举类型, 在服务器类里面调用 或 在客户端类里面调用。 如果客户端SendRT的cmd = RTCmd.PublicRT, 就会在服务器类调用, 如果SendRT的cmd = RTCmd.EntityRT就会在NetPlayer派生类里面调用,也就是你自己定义的Player类。
SendERTP方法的progress参数:progress参数为发送大文件数据时的进度值,进度值是委托方法,可以监听当前发送的进度和状态,如果状态可靠失败,状态会变成失败状态,如果发送成功,则会是成功状态。
SendERTP方法的buffer参数:buffer参数是你要发送的文件字节数组,我们使用的文件都是有字节数组组成的
SendERT方法的func参数:function参数为指定调用远程端的函数名称, 如果客户端Send, 服务器必须要有func字符串指定的函数, 比如客户端Send("Test"); 那么服务器必须要有void Test()方法接收,Test方法加上[Rpc]特性即可
SendERTP方法的progressFunc参数:progressFunc参数是指定要调用远程机器的函数名,如果这函数名不存在,则会提示
SendERTP方法的progressItem参数:progressItem参数是指定要调用远程机器的一个辅助参数,远程端必须要这样声明 progressFunc(object progressItem, int progressValue) 的方法, progressFunc是你自己指定的名称,object progressItem参数可以使用真实类型, 就是SendERTP的时候传入的参数值的类, 就会变成progressFunc(xxx progressItem, int progressValue)
SendERTP方法的pars参数:pars参数是远程函数的参数对象, pars参数必须要指定对远程机器端的真实参数,如果指定参数不一致或者不匹配,都会调用失败。(pars参数不能传入基于unity的Object类的对象,在unity中只能使用少数的结构体类型, 如Vector2,3,4, Rect, Color....)
AddOperation方法:
AddOperation方法是Send方法的优化版, 网络帧同步,状态同步的网络数据传输使用方法。
AddOperation方法你调用时是不会直接发送数据给客户端的,如果使用Send就会直接发送,为了网络的均衡,AddOperation方法每秒只发送20次数据,你所调用的AddOperation方法,只是把你要发送的数据添加到帧列表里面,等待时间到后会自动发送给客户端,发送后会清除掉已经发送的数据列表。如果想修改每秒发送次数,可修改GameManager的Run方法参数
AddOperation方法的参数,上面基本全面盖过了,请看Send方法介绍。