mina之Iobuffer简单封装



public static final CharsetDecoder decoder = (Charset.forName("UTF-8"))
            .newDecoder();
    /**
     * @return
     */
    @Override
    public IoBuffer creatIoBuffer() {
        return IoBuffer.allocate(0x40).setAutoExpand(true);
    }

    /**
     * @param capacity
     * @return
     */
    @Override
    public IoBuffer creatIoBuffer(int capacity) {
        return IoBuffer.allocate(capacity).setAutoExpand(true);
    }

    /**
     * 数据包分发
     *
     * @param buffer
     * @param player
     */
    public abstract void DispatchPack(IoBuffer buffer, PlayerInstance player) throws Exception;

    /**
     * 解析buffer数据为json对象
     * @param buffer
     * @param clazz    java bean class
     * @return
     */
    @Override
    @SuppressWarnings("unchecked")
    public Object parseObject(IoBuffer buffer, Class clazz) throws CharacterCodingException {
        Object o= JSON.parseObject(buffer.getString(decoder),clazz);
        return o;
    }

    /**
     * read a byte (1 code)
     *
     * @param buffer buffer
     * @return byte
     */
    @Override
    public byte readByte(IoBuffer buffer) {
        return buffer.get();
    }

    /**
     * read a short (2 code)
     *
     * @param buffer buffer
     * @return short
     */
    @Override
    public short readShort(IoBuffer buffer) {
        return buffer.getShort();
    }

    /**
     * read a short (4 code)
     *
     * @param buffer buffer
     * @return int
     */
    @Override
    public int readInt(IoBuffer buffer) {
        return buffer.getInt();  //To change body of implemented methods use File | Settings | File Templates.
    }

    /**
     * @param buffer 待处理数据缓存区
     * @return message
     *         如果默认读取1字节(readBytes())长度的字符串,那么该方法传入buffer将直接返回相应的字符串
     *         编码格式:utf-8
     */
    @Override
    public String readStringUTF8(IoBuffer buffer) throws CharacterCodingException {
        int l=buffer.get();
        return buffer.getString(l,decoder);
    }
    /**
     * @param buffer 待处理数据缓存区
     * @param length 读取指定的数据长度  readBytes() ,readShort() or readLong();
     * @return message
     *         编码格式:utf-8
     */
    @Override
    public String readStringUTF8(IoBuffer buffer, int length) throws CharacterCodingException {
        return buffer.getString(length,decoder);
    }

    /**
     * 构建数据包 ,处理一级类型数据包
     * 注意:此方法适应的协议是:
     * paras数据结构-----> length+msg+length+msg ... ...
     * length: byte(1字节),short(2字节),int(4字节)
     *
     * @param arg1 类型1  注意 :args1<0
     * @return buffer
     */
    @Override
    public IoBuffer getWriteBufferA(int arg1, Object... paras) {
        return getWriteBuffer(arg1, 0, null, paras);
    }

    /**
     * 构建数据包 ,处理二级类型数据包
     *
     * @param arg1  类型1
     * @param arg2  类型2
     * @param paras 待发送的数据
     *              paras数据-----> length+msg+length+msg ... ...
     *              length: byte(1字节),short(2字节),int(4字节)
     * @return buffer
     */
    @Override
    public IoBuffer getWriteBufferB(int arg1, int arg2, Object... paras) {
        return getWriteBuffer(arg1,arg2,null,paras);  //To change body of implemented methods use File | Settings | File Templates.
    }

    /**
     * 构建数据包
     * @param arg1 类型1
     * @param arg2  类型2
     * @param buffer 申请的buf
     * @param paras 待发送的数据
     *              paras数据-----> length+msg+length+msg ... ...
     *              length: byte(1字节),short(2字节),int(4字节)
     * @return buffer
     */
    private IoBuffer getWriteBuffer(int arg1,int arg2,IoBuffer buffer,Object...paras){
        if (buffer==null){
            buffer= IoBuffer.allocate(0x40).setAutoExpand(true);
        }
        buffer.putShort(Short.MIN_VALUE);//包长占2字节
        buffer.put((byte) arg1);
        if (arg2!=0)buffer.put((byte) arg2);
        for (Object para:paras){
            if (para instanceof Byte){
                buffer.put((Byte) para);  // 占1字节
            }else  if ((para instanceof String)){
                buffer.put(((String) para).getBytes());
            } else if (para instanceof Integer){
                buffer.putInt((Integer) para);    //占4字节
            }else  if (para instanceof Short){
                buffer.putShort((Short) para);  //占2字节
            }
        }
        buffer.putShort(0, (short) (buffer.position()-0x2));
        buffer.flip();
        return buffer;
    }

转载于:https://my.oschina.net/chenleijava/blog/133978

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值