/* * Copyright 2013-2018 Lilinfeng. * * 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 com.phei.netty.protocol.netty.codec; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.phei.netty.protocol.netty.struct.Header; import com.phei.netty.protocol.netty.struct.NettyMessage; /** * @author Administrator * @date 2014年3月15日 * @version 1.0 */ public class TestCodeC { MarshallingEncoder marshallingEncoder; MarshallingDecoder marshallingDecoder; public TestCodeC() throws IOException { marshallingDecoder = new MarshallingDecoder(); marshallingEncoder = new MarshallingEncoder(); } public NettyMessage getMessage() { NettyMessage nettyMessage = new NettyMessage(); Header header = new Header(); header.setLength(123); header.setSessionID(99999); header.setType((byte) 1); header.setPriority((byte) 7); Map<String, Object> attachment = new HashMap<String, Object>(); for (int i = 0; i < 10; i++) { attachment.put("ciyt --> " + i, "lilinfeng " + i); } header.setAttachment(attachment); nettyMessage.setHeader(header); nettyMessage.setBody("abcdefg-----------------------AAAAAA"); return nettyMessage; } public ByteBuf encode(NettyMessage msg) throws Exception { ByteBuf sendBuf = Unpooled.buffer(); sendBuf.writeInt((msg.getHeader().getCrcCode())); sendBuf.writeInt((msg.getHeader().getLength())); sendBuf.writeLong((msg.getHeader().getSessionID())); sendBuf.writeByte((msg.getHeader().getType())); sendBuf.writeByte((msg.getHeader().getPriority())); sendBuf.writeInt((msg.getHeader().getAttachment().size())); String key = null; byte[] keyArray = null; Object value = null; for (Map.Entry<String, Object> param : msg.getHeader().getAttachment() .entrySet()) { key = param.getKey(); keyArray = key.getBytes("UTF-8"); sendBuf.writeInt(keyArray.length); sendBuf.writeBytes(keyArray); value = param.getValue(); marshallingEncoder.encode(value, sendBuf); } key = null; keyArray = null; value = null; if (msg.getBody() != null) { marshallingEncoder.encode(msg.getBody(), sendBuf); } else sendBuf.writeInt(0); sendBuf.setInt(4, sendBuf.readableBytes()); return sendBuf; } public NettyMessage decode(ByteBuf in) throws Exception { NettyMessage message = new NettyMessage(); Header header = new Header(); header.setCrcCode(in.readInt()); header.setLength(in.readInt()); header.setSessionID(in.readLong()); header.setType(in.readByte()); header.setPriority(in.readByte()); int size = in.readInt(); if (size > 0) { Map<String, Object> attch = new HashMap<String, Object>(size); int keySize = 0; byte[] keyArray = null; String key = null; for (int i = 0; i < size; i++) { keySize = in.readInt(); keyArray = new byte[keySize]; in.readBytes(keyArray); key = new String(keyArray, "UTF-8"); attch.put(key, marshallingDecoder.decode(in)); } keyArray = null; key = null; header.setAttachment(attch); } if (in.readableBytes() > 4) { message.setBody(marshallingDecoder.decode(in)); } message.setHeader(header); return message; } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { TestCodeC testC = new TestCodeC(); NettyMessage message = testC.getMessage(); System.out.println(message + "[body ] " + message.getBody()); for (int i = 0; i < 5; i++) { ByteBuf buf = testC.encode(message); NettyMessage decodeMsg = testC.decode(buf); System.out.println(decodeMsg + "[body ] " + decodeMsg.getBody()); System.out .println("-------------------------------------------------"); } } }