public bool TryDecodePackage(ConnectionEventArgs e, out RequestPackage package) { byte[] content = null; CLPacketHead head = ReadMessageHead(e.Data, out content); if (head == null) { var packageReader = new PackageReader(e.Data, Encoding.UTF8); if (TryBuildPackage(packageReader, out package)) { package.OpCode = e.Meaage.OpCode; package.CommandMessage = e.Socket.IsWebSocket && e.Meaage.OpCode == OpCode.Text ? e.Meaage.Message : null; return(true); } package = null; return(false); } package = new RequestPackage(head.MsgId, head.SessionId, head.ActionId, head.UserId) { Message = content }; return(true); }
private CLPacketHead ReadMessageHead(byte[] data, out byte[] content) { CLPacketHead headPack = null; content = new byte[0]; try { int pos = 0; byte[] headLenBytes = new byte[4]; Buffer.BlockCopy(data, pos, headLenBytes, 0, headLenBytes.Length); pos += headLenBytes.Length; int headSize = BitConverter.ToInt32(headLenBytes, 0); if (headSize < data.Length) { byte[] headBytes = new byte[headSize]; Buffer.BlockCopy(data, pos, headBytes, 0, headBytes.Length); pos += headBytes.Length; headPack = ProtoBufUtils.Deserialize <CLPacketHead>(headBytes); if (data.Length > pos) { int len = data.Length - pos; content = new byte[len]; Buffer.BlockCopy(data, pos, content, 0, content.Length); } } else { TraceLog.ReleaseWriteFatal("Can not parse packet head."); } } catch (Exception ex) { TraceLog.WriteError(ex.Message); } return(headPack); }