当前位置: 首页 > news >正文

mina之Iobuffer简单封装

2019独角兽企业重金招聘Python工程师标准>>> hot3.png



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

相关文章:

  • Silverlight Navigation导航框架实例系列汇总
  • 自定义context自定义Dialog之Progress(二)
  • DELL服务器硬件信息采集SHELL脚本
  • hdu 2888 Check Corners
  • Android tabHost 刷新Activity
  • 测试在CENTOS X64 6.2 上安装ORACLE 11g client
  • function类html5游戏开发-零基础开发《圣诞老人送礼物》小游戏
  • 3G美餐:谁有红苹果?
  • .NET中 MVC 工厂模式浅析
  • Hyper-V 2节点集群高可用的限制
  • 记几个IOS工具网站
  • MIME邮件面面观
  • CentOS 6.3(x86_32)下安装Oracle 10g R2
  • lsof命令的使用
  • linux0.11学习笔记(2)
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • C++类中的特殊成员函数
  • Docker下部署自己的LNMP工作环境
  • ES学习笔记(12)--Symbol
  • java2019面试题北京
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • node.js
  • 程序员该如何有效的找工作?
  • 构建工具 - 收藏集 - 掘金
  • 缓存与缓冲
  • 前端设计模式
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 鱼骨图 - 如何绘制?
  • 在Mac OS X上安装 Ruby运行环境
  • HanLP分词命名实体提取详解
  • MPAndroidChart 教程:Y轴 YAxis
  • ​你们这样子,耽误我的工作进度怎么办?
  • #android不同版本废弃api,新api。
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (多级缓存)多级缓存
  • (接口自动化)Python3操作MySQL数据库
  • (一)VirtualBox安装增强功能
  • .form文件_一篇文章学会文件上传
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .Net 知识杂记
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET企业级应用架构设计系列之结尾篇
  • @Query中countQuery的介绍
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AIGC] Redis基础命令集详细介绍
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [ASP]青辰网络考试管理系统NES X3.5
  • [C/C++] C/C++中数字与字符串之间的转换