赞
踩
通信方面:Socket采用TCP模式面向连接传输。
粘包机制:若持续有发送的内容,则会延迟发送本次信息,等待下一次的信息一起发送。信息粘结。从而导致无法把多个信息区分开。
TCP提供面向连接的、可靠的数据流传输,所以当我们发送数据在短时间内比较频繁并且数据量比较小时,TCP为了优化内存资源,会将多条数据粘成几个包来进行处理,相比发送的消息条数要少了很多。比如,客户端在非常的时间内向服务器发送了100条数据,每条数据的字节长度又比较小,那么在服务器端收到的可能只有几条数据,因为粘包,这100条数据粘成了几个包,这样优化了内存资源,这其实是TCP的一种优化机制,这看似是一种好处,但是在开发网络游戏时,反而是坏处,因为在网络游戏中,客户端需要频繁向服务器发送多条数据,如果出现了粘包情况,可能会出现画面帧不同步。
分包:当发送的一条数据的数据量比较大的时候,而服务器的数据缓冲区一次却装不下那么多的数据,所以就会将这一条数据分成 几个包,也就是说把该条数据分割成几个数据,因为数据发送接收都是以字节数组的形式传输,所以可能会出现数据的丢失,这种情况在实际开发中也需要避免。
request:发送请求
UIPanel:收到请求后将数据更新在Panel上
manager:管理与服务端的连接
解决粘包分包问题:
由于传输的数据是字节数组,我们可以得到该条数据字节数组的长度,长度是一个整型,并且所占字节长度固定为4,所以可以将该整型数据转成字节数组,不管消息的长度多大,该整型数据的字节数组长度始终为4(因为sizeof(int) = 4),所以发送数据的时候,在该条数据的前面加上这个整型数据的字节数组,也就是说,发出去的数据,前四个字节表示实际消息的长度,后面的字节表示实际消息。比如我们要发送 HelloWorld, 实际上发送的是4HelloWorld。
封装每次信息,包头包含信息长度。
接收方获取信息长度,如果收到的消息长度已经满足了此信息长度则从缓存区截取出对应长度的信息并去处理请求。
被截断后剩余的信息继续等待并重复这个操作。
public class NoticeRequest : BaseRequest
{
public StartPanel startPanel;
public Text noticeText;
private MainPack pack = null;
public override void Awake()
{
requestCode = RequestCode.UserRequest;//提前定义好这个脚本对应什么操作
actionCode =
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。