mina 字节数组编解码器的写法 I
mina 服务器与 mina 客户端通讯的话,
一、传递 String 时编解码工厂使用 mina 自带的 TextLineCodecFactory 即可;
二、传递 java 对象或 byte[] 时编解码工厂使用 ObjectSerializationCodecFactory 即可。
byte[] 实际上就相当于一个 java 对象,在 mina Object..CodecEncoder 的源码中可以清楚的看到,
如果传递的不是一个实现了 Serializable 接口的东西,在 encode 方法调用的时候是会抛出异常的。
见如下代码:
- public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
- if (!(message instanceof Serializable)) {
- throw new NotSerializableException();
- }
- IoBuffer buf = IoBuffer.allocate(64);
- buf.setAutoExpand(true);
- buf.putObject(message);
- int objectSize = buf.position() - 4;
- if (objectSize > maxObjectSize) {
- throw new IllegalArgumentException("The encoded object is too big: " + objectSize + " (> " + maxObjectSize
- + ')');
- }
- buf.flip();
- out.write(buf);
- }
三、如果是以下一种特殊的情况呢?
一般的,使用 ObjectSerializationCodecFactory 完成编码操作以后,java 对象就被序列化为便于传递的 byte[] 了。
但如果我想要 session.write() 出去的 byte[] 数据不经历序列化直接写给另一端呢?
(byte[] 序列化以后得到的还是 byte[],但是数据会发生改变,长度也会加长很多)。
很容易就能想到把该端的 ObjectSerializationCodecFactory 过滤器移除掉不就行了么。。
同时也将另一端的这个过滤器移除掉。。
但 “不经过解码器直通” 实际上是行不通的。
在直通的情况下,一端向另一端直接发送的 byte[] 数据,在另一端虽然能接收到,但不会触发该端 hanlder 的 messageRecv 方法。
换言之,即使是如此简单的一个需求,也还是要书写一个编解码工厂。
(完成了这一步之后就爽歪歪了,mina 和 c++ 端的通讯将变得没有障碍——byte[] 和 char[] )
下面是一个简陋的 byte[] 编解码工厂
ByteArrayEncoder.java
- package org.bruce.mina.cpp.codec;
- import org.apache.mina.core.buffer.IoBuffer;
- import org.apache.mina.core.session.IoSession;
- import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
- import org.apache.mina.filter.codec.ProtocolEncoderOutput;
- /**
- * @author BruceYang
- *
- * 编写编码器的注意事项:
- * 1、 mina 为 IoSession 写队列里的每个对象调用 ProtocolEncode.encode 方法。
- * 因为业务处理器里写出的都是与编码器对应高层对象,所以可以直接进行类型转换。
- * 2、从 jvm 堆分配 IoBuffer,最好避免使用直接缓存,因为堆缓存一般有更好的性能。
- * 3、开发人员不需要释放缓存, mina 会释放。
- * 4、在 dispose 方法里可以释放编码所需的资源。
- */
- public class ByteArrayEncoder extends ProtocolEncoderAdapter {
- @Override
- public void encode(IoSession session, Object message,
- ProtocolEncoderOutput out) throws Exception {
- // TODO Auto-generated method stub
- byte[] bytes = (byte[])message;
- IoBuffer buffer = IoBuffer.allocate(256);
- buffer.setAutoExpand(true);
- buffer.put(bytes);
- buffer.flip();
- out.write(buffer);
- out.flush();
- buffer.free();
- }
- }
ByteArrayDecoder.java
- package org.bruce.mina.cpp.codec;
- import org.apache.mina.core.buffer.IoBuffer;
- import org.apache.mina.core.session.IoSession;
- import org.apache.mina.filter.codec.ProtocolDecoderAdapter;
- import org.apache.mina.filter.codec.ProtocolDecoderOutput;
- /**
- * @author BruceYang
- *
- */
- public class ByteArrayDecoder extends ProtocolDecoderAdapter {
- @Override
- public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
- throws Exception {
- // TODO Auto-generated method stub
- int limit = in.limit();
- byte[] bytes = new byte[limit];
- in.get(bytes);
- out.write(bytes);
- }
- }
ByteArrayCodecFactory.java
- package org.bruce.mina.cpp.codec;
- import org.apache.mina.core.session.IoSession;
- import org.apache.mina.filter.codec.ProtocolCodecFactory;
- import org.apache.mina.filter.codec.ProtocolDecoder;
- import org.apache.mina.filter.codec.ProtocolEncoder;
- /**
- * @author BruceYang
- *
- */
- public class ByteArrayCodecFactory implements ProtocolCodecFactory {
- private ByteArrayDecoder decoder;
- private ByteArrayEncoder encoder;
- public ByteArrayCodecFactory() {
- encoder = new ByteArrayEncoder();
- decoder = new ByteArrayDecoder();
- }
- @Override
- public ProtocolDecoder getDecoder(IoSession session) throws Exception {
- return decoder;
- }
- @Override
- public ProtocolEncoder getEncoder(IoSession session) throws Exception {
- return encoder;
- }
- }
mina 字节数组编解码器的写法 I的更多相关文章
- mina 字节数组编解码器的写法 II
I 里面的写法不够严谨,这也是我之前说它简陋的主要原因,下面来个更加严谨.完整一点儿的: ByteArrayEncoder.java package org.bruce.mina.cpp.codec; ...
- 使用 mina 传输大字节数组
转载自:http://seara520.blog.163.com/blog/static/16812769820103214817781/ 使用mina传输超过2k以上的数据时(采用tcp方式,如果是 ...
- Java将文件转为字节数组
Java将文件转为字节数组 关键字:文件,文件流,字节流,字节数组,二进制 摘要:最近工作中碰到的需求是,利用http传输二进制数据到服务器对应接口,需要传输userId, file(加密后)等一系列 ...
- (IEEE-754) 字节数组与浮点数之间的互相转换(MODBUS float类型)
在做上位机开发过程中,经常会碰到字节数组与浮点数,整数等数据之间的转换,有时为了验证数据是否解析正确,得借助于IEEE浮点数工具,本文把基于c#实现的浮点数与字节数组(或16进制的字符串)转换的实现方 ...
- C#字节数组转换成字符串
C#字节数组转换成字符串 如果还想从 System.String 类中找到方法进行字符串和字节数组之间的转换,恐怕你会失望了.为了进行这样的转换,我们不得不借助另一个类:System.Text.Enc ...
- 【.net】从比较两个字节数组谈起
上午,有位初学者朋友问:如何比较两个字节数组中各字节是否相等? 不许笑,我一向反对嘲笑初学者,初学者不认真学习时你可以批评,但不能讥嘲.你不妨想想,你自己开始学习编程的时候又是什么个光景? 好,于是, ...
- 使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转
包名称:org.apache.commons.codec.binary 类名称:org.apache.commons.codec.binary.Hex 1.字节数组(byte[])转为十六进制(Hex ...
- java 字节数组转int
4字节数组转int类型 小端模式 /** * 数组转int类型 * * @param src * @return */ public static int bytesToInt(byte[] src) ...
- java 读取文件的字节数组
/*文件64位编码*/ public static void main(String[] args) { byte[] fileByte = toByteArray(newFile); St ...
随机推荐
- POJ1837 Balance(DP)
POJ1837http://poj.org/problem?id=1837 题目大意就是说有一个称上有C个挂钩,告诉你每个挂钩的位置,现在有G个重物,求是之平衡的方法数. 转化一下:DP[i][j]表 ...
- HDU1003前导和
简单维护前导和 #include<stdio.h> int main() { ],cas,key=; scanf("%d",&cas); while(cas-- ...
- oracle创建自增长列
--创建一个新表 /*create table students(stu_id number,stu_name varchar2(20),stu_email varchar2(40),primary ...
- HDU 1392 Surround the Trees 构造凸包
又是一道模板题 #include <iostream> #include <cstring> #include <cstdlib> #include <cst ...
- Activity之间使用intent传递大量数据带来问题总结
转载:大飞 http://blog.csdn.net/rflyee/article/details/47441405 Activity之间使用Parcel传递大量数据产生的问题. Activity ...
- T4 模板入门
T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit.T4(Text Template Transformation Toolkit)是微软官方在 ...
- 10个经典的Java main 方法面试题
1. 不用main方法如何定义一个类? 不行,没有main方法不能运行Java类. 在Java 7之前,你可以通过使用静态初始化运行Java类.但是,从Java 7 开始就不行了. 2. main() ...
- Python之函数进阶
本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...
- AspNet上传文件的几个控件
本文转载:http://www.cnblogs.com/downmoon/archive/2009/02/05/1384931.html 1.AspnetUpload 地址:http://www.as ...
- 解决xp搜索“文件中的一个字或者词组”失效
问:我的电脑安装的是Windows XP系统,最近它的文件搜索功能不能用了,打开搜索界面时,输入文件或文件夹名的文本框是灰色的,无法输入.请问该怎么解决? 答:打开注册表编辑器,定位到[HKEY_CU ...