/** * Author: zero * Created: 2012-7-25 * Copyright: CWA HummingBird 2012 */ package com.cwa.nettyserver.codec; import com.cwa.gamecore.message.GameMessage; import org.jboss.netty.buffer.ChannelBuffer; import com.cwa.gamecore.message.GameRequest; import com.cwa.gamecore.message.MessageFactory; import com.cwa.nettyserver.framework.AbstractNettyDecoder; /** * 游戏中实际使用的解码器 * @author zero */ public class GameDecoder extends AbstractNettyDecoder { public static final byte[] HEAD = GameMessage.MAGIC_NUMBERS; @Override public Object decode(ChannelBuffer buffer) { // check length of buffer if (buffer.readableBytes() < 6) { return null; } buffer.markReaderIndex(); // check head if (!checkHead(buffer, HEAD)) { buffer.resetReaderIndex(); return null; } // decode content // get length int len = buffer.readInt(); if (len > buffer.readableBytes()) { return null; } int commandId = buffer.readInt(); // decode body GameRequest request = MessageFactory.getInstance().getMessage(commandId); if (null != request) request.decodeBody(new NettyGameInput(buffer)); return request; } private boolean checkHead(ChannelBuffer buffer, byte[] head) { byte[] content = new byte[2]; buffer.readBytes(content); if (content[0] == head[0] && content[1] == head[1]) { return true; } return false; } }