/* * Copyright 2008-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.hasor.rsf.protocol.rsf.v1; import io.netty.buffer.ByteBuf; import net.hasor.rsf.protocol.rsf.Protocol; import net.hasor.rsf.utils.ProtocolUtils; import java.io.IOException; /** * Protocol Interface,for custom network protocol * @version : 2014年11月4日 * @author 赵永春(zyc@hasor.net) */ public class RpcResponseProtocolV1 implements Protocol<ResponseBlock> { /**encode Message to byte & write to network framework*/ public void encode(ResponseBlock resMsg, ByteBuf buf) throws IOException { // //* --------------------------------------------------------bytes =13 //* byte[1] version RSF版本(0x81) buf.writeByte(resMsg.getHead()); //* byte[8] requestID 请求ID buf.writeLong(resMsg.getRequestID()); //* byte[1] keepData 保留区 buf.writeByte(0); //* byte[3] contentLength 内容大小(max = 16MB) ByteBuf responseBody = this.encodeResponse(resMsg); int bodyLength = responseBody.readableBytes(); bodyLength = (bodyLength << 8) >>> 8;//左移8未,在无符号右移8位。形成最大16777215字节的限制。 buf.writeMedium(bodyLength); // buf.writeBytes(responseBody); // } // private ByteBuf encodeResponse(ResponseBlock resMsg) { ByteBuf bodyBuf = ProtocolUtils.newByteBuf(); // //* --------------------------------------------------------bytes =8 //* byte[2] status 响应状态 bodyBuf.writeShort(resMsg.getStatus()); //* byte[2] serializeType-(attr-index) 序列化策略 bodyBuf.writeShort(resMsg.getSerializeType()); //* byte[2] returnData-(attr-index) 返回数据 bodyBuf.writeShort(resMsg.getReturnData()); //* --------------------------------------------------------bytes =1 ~ 1021 //* byte[1] optionCount 选项参数总数 int[] optionMapping = resMsg.getOptions(); bodyBuf.writeByte(optionMapping.length); for (int i = 0; i < optionMapping.length; i++) { //* byte[4] ptype-0-(attr-index,attr-index) 选项参数1 //* byte[4] ptype-1-(attr-index,attr-index) 选项参数2 bodyBuf.writeInt(optionMapping[i]); } //* --------------------------------------------------------bytes =n //* dataBody 数据池 resMsg.fillTo(bodyBuf); return bodyBuf; } // // // /**decode stream to object*/ public ResponseBlock decode(ByteBuf buf) throws IOException { //* --------------------------------------------------------bytes =13 //* byte[1] version RSF版本 byte version = buf.readByte(); //* byte[8] requestID 包含的请求ID long requestID = buf.readLong(); //* byte[1] keepData 保留区 buf.skipBytes(1); //* byte[3] contentLength 内容大小 buf.skipBytes(3);//.readUnsignedMedium() // ResponseBlock res = new ResponseBlock(); res.setHead(version); res.setRequestID(requestID); //* --------------------------------------------------------bytes =8 //* byte[2] status 响应状态 res.setStatus(buf.readShort()); //* byte[2] serializeType-(attr-index) 序列化策略 res.setSerializeType(buf.readShort()); //* byte[2] returnData-(attr-index) 返回数据 res.setReturnData(buf.readShort()); //* --------------------------------------------------------bytes =1 ~ 1021 //* byte[1] optionCount 选项参数总数 byte optionCount = buf.readByte(); for (int i = 0; i < optionCount; i++) { //* byte[4] attr-0-(attr-index,attr-index) 选项参数 int mergeData = buf.readInt(); res.addOption(mergeData); } //* --------------------------------------------------------bytes =n //* dataBody 数据池 res.fillFrom(buf); return res; } }