static byte[] Encode(object message) { if (message == null) { return(TransferPacket.EmptyByteArray); } var type = message.GetType(); var typeCode = BinarySerializer.GetTypeCode(type); byte[] body; try { body = BinarySerializer.Serialize(message); } catch (System.Exception ex) { //序列化报文异常 SystemRunErrorPorvider.CatchException(ex); return(TransferPacket.EmptyByteArray); } var data = new byte[2 + body.Length]; unsafe { // 消息主码 data[0] = (byte)(typeCode / 256); //消息辅码 data[1] = (byte)typeCode; // 2.包体。 Buffer.BlockCopy(body, 0, data, 2, body.Length); return(TransferPacket.UnsafePacketData(TransferPacketType.Binnary, data)); } }
/// <summary> /// /// </summary> /// <param name="meeage"></param> public TransferMessage(string meeage) { this.UPacketData = TransferPacket.UnsafePacketData(TransferPacketType.Binnary, meeage.GetBytes()); this._message = meeage; }
/// <summary> /// /// </summary> /// <param name="buffer"></param> /// <param name="packdata"></param> /// <param name="needBytesPackdata"></param> /// <returns></returns> private static unsafe bool UnPacketData(byte[] buffer, out TransferPacket packdata, bool needBytesPackdata = false) { return(UnPacketData(new NetworkStream(buffer), out packdata, needBytesPackdata)); }
/// <summary> /// /// </summary> /// <param name="meeage"></param> public TransferMessage(TransferPacket meeage) { this.UPacketData = meeage; }
/// <summary> /// /// </summary> /// <param name="buffer"></param> /// <param name="packdata"></param> /// <param name="needBytesPackdata"></param> /// <returns></returns> private static bool UnPacketData(NetworkStream buffer, out TransferPacket packdata, bool needBytesPackdata = false) { packdata = Null; byte[] data = null; byte[] bytespackdata = null; int index = 0; int read = 2; while (true) { if (buffer.Count < index + 1) { return(false); } switch (buffer[index]) { case (byte)TransferPacketType.HeartBeatPing: { #region 心跳包消息 //心跳包消息 packdata = TransferPacket.HeartBeatPing; //删除前导无效数据 buffer.Remove(index + 1); return(true); #endregion } case (byte)TransferPacketType.HeartBeatPong: { #region 心跳包响应消息 //心跳包响应消息 packdata = TransferPacket.HeartBeatPong; //删除前导无效数据 buffer.Remove(index + 1); return(true); #endregion } case (byte)TransferPacketType.Binnary: { #region 二进制流数据拆包 //删除前导无效数据 buffer.Remove(index); if (buffer.Count < 1) { return(false); } int len; if (!ReadLength(buffer, out len, ref read)) { return(false); } if (buffer.Count < len + read) { return(false); } data = buffer.ReadArray(read, len); if (needBytesPackdata) { bytespackdata = buffer.ReadAndRemoveBytes(len + read); } else { buffer.Remove(len + read); } packdata = new TransferPacket(TransferPacketType.Binnary, data, bytespackdata); return(true); #endregion }; default: { index++; continue; } } } }