[Serializable]
public class UDPPackage
{
/// <summary>
/// 包中的二进制数据
/// </summary>
public byte[] Bytes { get; set; }
/// <summary>
/// 所属包集合的编号
/// </summary>
public int PacketSerializedId { get; set; }
/// <summary>
/// 所属包集合中的第几个包
/// </summary>
public int PacketIndex { get; set; }
/// <summary>
/// 当前包分包的个数
/// </summary>
public int PacketCount { get; set; }
}
分包
//每个包中二进制数组的长度
public static int len = 20480;
//分包的方法,传入一个byte数组和包的编号(编号是用来判断收到数据是否是同一个包的)
public static List<UDPPackage> GetList(byte[] bytes, int id)
{
if (bytes==null||bytes.Length==0) return null;
List<UDPPackage> packages = new List<UDPPackage>();
//int index = 0;//用来记录包在包集合中的位置
int count = bytes.Length / len;//分包后集合包的数量
if (bytes.Length % len > 0) count++;
for (int i = 0; i < count; i++)
{
int all = len;
if (i == count - 1)
{
all = bytes.Length - i * len;
}
byte[] bs = new byte[all];
Buffer.BlockCopy(bytes, i * len, bs, 0, all);
packages.Add(new UDPPackage
{
Bytes = bs,
PacketIndex = i,
PacketSerializedId = id,
PacketCount = count
});
}
return packages;
}
组包:
static List<UDPPackage> udps = new List<UDPPackage>();
public static byte[] GetBytes(UDPPackage package, int count)
{
List<byte> bytes = new List<byte>();
udps.Add(package);
//linq查询,查出包集合中所有和传入包编号拥有相同编号的包,并根据所在包
//的位置排序
var result = from n in udps
where n.PacketSerializedId == count
orderby n.PacketIndex
select n;
//判断查出包的集合是否跟分包时的数量一样
if (result.Count() == package.PacketCount)
{
foreach (var item in result)
{
bytes.AddRange(item.Bytes);
}
//调用清包方法,清除所有组包完成的包
clear(count);
return bytes.ToArray();
}
else
{
return null;
}
}
//清除方法,根据传入的包编号删除所有包集合中拥有此包编号的包
private static void clear(int index)
{
for (int i = 0; i < udps.Count;)
{
//判读包的编号是否已传入的编号相同
//如果相同则删除,否则进入下一个
if (udps[i].PacketSerializedId == index)
udps.Remove(udps[i]);
else
i++;
}
}