//创建数据包 public byte[] Packer(PackHead head, byte[] bodyData) { byte[] headData = Binary.SerializeByMarshal(head); byte[] packData = new byte[headData.Length + bodyData.Length]; Array.Copy(headData, packData, headData.Length); Array.Copy(bodyData, 0, packData, headData.Length, bodyData.Length); return(packData); }
//创建数据包 public byte[] Packer(int msgID, byte[] bodyData) { PackHead head = new PackHead(); head.MsgID = msgID; if (bodyData == null) { bodyData = new byte[0]; } head.BodyLength = (short)bodyData.Length;// (Marshal.SizeOf(head) + bodyData.Length); byte[] headData = SerializeUtil.ToPtr(head); byte[] packData = new byte[headData.Length + bodyData.Length]; Array.Copy(headData, packData, headData.Length); Array.Copy(bodyData, 0, packData, headData.Length, bodyData.Length); return(packData); }
//解析数据包 public void UnPack(byte[] data) { PackHead head = new PackHead(); int headLength = Binary.SerializeByMarshal(head).Length; byte[] totalData = new byte[OtherBytes.Length + data.Length]; if (OtherBytes.Length > 0) { Array.Copy(OtherBytes, totalData, OtherBytes.Length); } Array.Copy(data, 0, totalData, OtherBytes.Length, data.Length); if (totalData.Length < headLength) { //消息头不足 OtherBytes = totalData; Debug.LogError("消息头长度不足!"); return; } byte[] headData = new byte[headLength]; Array.Copy(totalData, headData, headLength); head = Binary.DeserializeByMarshal <PackHead>(headData); if (totalData.Length < head.PackLength) { //消息体不足 OtherBytes = totalData; return; } byte[] bodyData = new byte[head.PackLength - headLength]; Array.Copy(totalData, headLength, bodyData, 0, bodyData.Length); //整包发送 SendPack(head, bodyData); int leftLength = totalData.Length - head.PackLength; if (leftLength > 0) { //发生粘包 OtherBytes = new byte[leftLength]; Array.Copy(totalData, head.PackLength, OtherBytes, 0, leftLength); if (leftLength >= headLength) { //采用递归进行再次拆包 UnPack(new byte[0]); } } }
//解析数据包 public void UnPack(byte[] data) { PackHead head = new PackHead(); int headLength = SerializeUtil.ToPtr(head).Length; int packLength = 0; byte[] totalData = new byte[LeftBytes.Length + data.Length]; if (LeftBytes.Length > 0) { Array.Copy(LeftBytes, 0, totalData, 0, LeftBytes.Length); } Array.Copy(data, 0, totalData, LeftBytes.Length, data.Length); if (totalData.Length < headLength) { //消息头不足 LeftBytes = totalData; return; } byte[] headData = new byte[headLength]; Array.Copy(totalData, headData, headLength); head = SerializeUtil.FromPtr <PackHead>(headData); packLength = head.BodyLength + headLength; if (totalData.Length < packLength) { //接受消息大小不足 LeftBytes = totalData; return; } byte[] bodyData = new byte[head.BodyLength]; Array.Copy(totalData, headLength, bodyData, 0, bodyData.Length); //整包发送 SendPack(head, bodyData); LeftBytes = new byte[totalData.Length - packLength]; if (LeftBytes.Length > 0) { //发生粘包 Array.Copy(totalData, packLength, LeftBytes, 0, LeftBytes.Length); if (LeftBytes.Length >= headLength) { //采用递归进行再次拆包 UnPack(new byte[0]); } } }
//发送消息体 public void SendPack(PackHead head, byte[] bodyData) { MsgManager.Instance.SendMsg(head.MsgID.ToString(), bodyData); Debug.Log("接收到消息ID:" + head.MsgID); }
public void Send(PackHead head, byte[] data) { byte[] sendData = dataPacker.Packer(head, data); Send(sendData); }
public void Send(PackHead head, byte[] data, string ip, int port) { byte[] sendData = dataPacker.Packer(head, data); Send(sendData, ip, port); }
//发送消息体 public void SendPack(PackHead head, byte[] bodyData) { // Debug.Log("接收消息ID:" + head.MsgID); MsgManager.Instance.Enqueue(head.MsgID, bodyData); }