mina 服务器与 mina 客户端通讯的话,

一、传递 String 时编解码工厂使用 mina 自带的 TextLineCodecFactory 即可;

二、传递 java 对象或 byte[] 时编解码工厂使用 ObjectSerializationCodecFactory 即可。

byte[] 实际上就相当于一个 java 对象,在 mina Object..CodecEncoder 的源码中可以清楚的看到,

如果传递的不是一个实现了 Serializable 接口的东西,在 encode 方法调用的时候是会抛出异常的。

见如下代码:

  1. public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
  2. if (!(message instanceof Serializable)) {
  3. throw new NotSerializableException();
  4. }
  5.  
  6. IoBuffer buf = IoBuffer.allocate(64);
  7. buf.setAutoExpand(true);
  8. buf.putObject(message);
  9.  
  10. int objectSize = buf.position() - 4;
  11. if (objectSize > maxObjectSize) {
  12. throw new IllegalArgumentException("The encoded object is too big: " + objectSize + " (> " + maxObjectSize
  13. + ')');
  14. }
  15.  
  16. buf.flip();
  17. out.write(buf);
  18. }

三、如果是以下一种特殊的情况呢?

一般的,使用  ObjectSerializationCodecFactory 完成编码操作以后,java 对象就被序列化为便于传递的 byte[] 了。

但如果我想要 session.write() 出去的 byte[] 数据不经历序列化直接写给另一端呢?

(byte[]  序列化以后得到的还是 byte[],但是数据会发生改变,长度也会加长很多)。

很容易就能想到把该端的 ObjectSerializationCodecFactory 过滤器移除掉不就行了么。。

同时也将另一端的这个过滤器移除掉。。

但 “不经过解码器直通” 实际上是行不通的。

在直通的情况下,一端向另一端直接发送的 byte[] 数据,在另一端虽然能接收到,但不会触发该端 hanlder 的 messageRecv 方法。

换言之,即使是如此简单的一个需求,也还是要书写一个编解码工厂。

(完成了这一步之后就爽歪歪了,mina 和 c++ 端的通讯将变得没有障碍——byte[] 和 char[]  )

下面是一个简陋的 byte[] 编解码工厂

ByteArrayEncoder.java

  1. package org.bruce.mina.cpp.codec;
  2.  
  3. import org.apache.mina.core.buffer.IoBuffer;
  4. import org.apache.mina.core.session.IoSession;
  5. import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
  6. import org.apache.mina.filter.codec.ProtocolEncoderOutput;
  7.  
  8. /**
  9. * @author BruceYang
  10. *
  11. * 编写编码器的注意事项:
  12. * 1、 mina 为 IoSession 写队列里的每个对象调用 ProtocolEncode.encode 方法。
  13. * 因为业务处理器里写出的都是与编码器对应高层对象,所以可以直接进行类型转换。
  14. * 2、从 jvm 堆分配 IoBuffer,最好避免使用直接缓存,因为堆缓存一般有更好的性能。
  15. * 3、开发人员不需要释放缓存, mina 会释放。
  16. * 4、在 dispose 方法里可以释放编码所需的资源。
  17. */
  18. public class ByteArrayEncoder extends ProtocolEncoderAdapter {
  19.  
  20. @Override
  21. public void encode(IoSession session, Object message,
  22. ProtocolEncoderOutput out) throws Exception {
  23. // TODO Auto-generated method stub
  24. byte[] bytes = (byte[])message;
  25.  
  26. IoBuffer buffer = IoBuffer.allocate(256);
  27. buffer.setAutoExpand(true);
  28.  
  29. buffer.put(bytes);
  30. buffer.flip();
  31.  
  32. out.write(buffer);
  33. out.flush();
  34.  
  35. buffer.free();
  36. }
  37. }

ByteArrayDecoder.java

  1. package org.bruce.mina.cpp.codec;
  2.  
  3. import org.apache.mina.core.buffer.IoBuffer;
  4. import org.apache.mina.core.session.IoSession;
  5. import org.apache.mina.filter.codec.ProtocolDecoderAdapter;
  6. import org.apache.mina.filter.codec.ProtocolDecoderOutput;
  7.  
  8. /**
  9. * @author BruceYang
  10. *
  11. */
  12. public class ByteArrayDecoder extends ProtocolDecoderAdapter {
  13.  
  14. @Override
  15. public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
  16. throws Exception {
  17. // TODO Auto-generated method stub
  18.  
  19. int limit = in.limit();
  20. byte[] bytes = new byte[limit];
  21.  
  22. in.get(bytes);
  23.  
  24. out.write(bytes);
  25. }
  26.  
  27. }

ByteArrayCodecFactory.java

  1. package org.bruce.mina.cpp.codec;
  2.  
  3. import org.apache.mina.core.session.IoSession;
  4. import org.apache.mina.filter.codec.ProtocolCodecFactory;
  5. import org.apache.mina.filter.codec.ProtocolDecoder;
  6. import org.apache.mina.filter.codec.ProtocolEncoder;
  7.  
  8. /**
  9. * @author BruceYang
  10. *
  11. */
  12. public class ByteArrayCodecFactory implements ProtocolCodecFactory {
  13.  
  14. private ByteArrayDecoder decoder;
  15. private ByteArrayEncoder encoder;
  16.  
  17. public ByteArrayCodecFactory() {
  18. encoder = new ByteArrayEncoder();
  19. decoder = new ByteArrayDecoder();
  20. }
  21.  
  22. @Override
  23. public ProtocolDecoder getDecoder(IoSession session) throws Exception {
  24. return decoder;
  25. }
  26.  
  27. @Override
  28. public ProtocolEncoder getEncoder(IoSession session) throws Exception {
  29. return encoder;
  30. }
  31.  
  32. }

mina 字节数组编解码器的写法 I的更多相关文章

  1. mina 字节数组编解码器的写法 II

    I 里面的写法不够严谨,这也是我之前说它简陋的主要原因,下面来个更加严谨.完整一点儿的: ByteArrayEncoder.java package org.bruce.mina.cpp.codec; ...

  2. 使用 mina 传输大字节数组

    转载自:http://seara520.blog.163.com/blog/static/16812769820103214817781/ 使用mina传输超过2k以上的数据时(采用tcp方式,如果是 ...

  3. Java将文件转为字节数组

    Java将文件转为字节数组 关键字:文件,文件流,字节流,字节数组,二进制 摘要:最近工作中碰到的需求是,利用http传输二进制数据到服务器对应接口,需要传输userId, file(加密后)等一系列 ...

  4. (IEEE-754) 字节数组与浮点数之间的互相转换(MODBUS float类型)

    在做上位机开发过程中,经常会碰到字节数组与浮点数,整数等数据之间的转换,有时为了验证数据是否解析正确,得借助于IEEE浮点数工具,本文把基于c#实现的浮点数与字节数组(或16进制的字符串)转换的实现方 ...

  5. C#字节数组转换成字符串

    C#字节数组转换成字符串 如果还想从 System.String 类中找到方法进行字符串和字节数组之间的转换,恐怕你会失望了.为了进行这样的转换,我们不得不借助另一个类:System.Text.Enc ...

  6. 【.net】从比较两个字节数组谈起

    上午,有位初学者朋友问:如何比较两个字节数组中各字节是否相等? 不许笑,我一向反对嘲笑初学者,初学者不认真学习时你可以批评,但不能讥嘲.你不妨想想,你自己开始学习编程的时候又是什么个光景? 好,于是, ...

  7. 使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转

    包名称:org.apache.commons.codec.binary 类名称:org.apache.commons.codec.binary.Hex 1.字节数组(byte[])转为十六进制(Hex ...

  8. java 字节数组转int

    4字节数组转int类型 小端模式 /** * 数组转int类型 * * @param src * @return */ public static int bytesToInt(byte[] src) ...

  9. java 读取文件的字节数组

    /*文件64位编码*/ public static void main(String[] args) {    byte[] fileByte = toByteArray(newFile);   St ...

随机推荐

  1. POJ1837 Balance(DP)

    POJ1837http://poj.org/problem?id=1837 题目大意就是说有一个称上有C个挂钩,告诉你每个挂钩的位置,现在有G个重物,求是之平衡的方法数. 转化一下:DP[i][j]表 ...

  2. HDU1003前导和

    简单维护前导和 #include<stdio.h> int main() { ],cas,key=; scanf("%d",&cas); while(cas-- ...

  3. oracle创建自增长列

    --创建一个新表 /*create table students(stu_id number,stu_name varchar2(20),stu_email varchar2(40),primary ...

  4. HDU 1392 Surround the Trees 构造凸包

    又是一道模板题 #include <iostream> #include <cstring> #include <cstdlib> #include <cst ...

  5. Activity之间使用intent传递大量数据带来问题总结

    转载:大飞 http://blog.csdn.net/rflyee/article/details/47441405   Activity之间使用Parcel传递大量数据产生的问题. Activity ...

  6. T4 模板入门

    T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit.T4(Text Template Transformation Toolkit)是微软官方在 ...

  7. 10个经典的Java main 方法面试题

    1. 不用main方法如何定义一个类? 不行,没有main方法不能运行Java类. 在Java 7之前,你可以通过使用静态初始化运行Java类.但是,从Java 7 开始就不行了. 2. main() ...

  8. Python之函数进阶

    本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...

  9. AspNet上传文件的几个控件

    本文转载:http://www.cnblogs.com/downmoon/archive/2009/02/05/1384931.html 1.AspnetUpload 地址:http://www.as ...

  10. 解决xp搜索“文件中的一个字或者词组”失效

    问:我的电脑安装的是Windows XP系统,最近它的文件搜索功能不能用了,打开搜索界面时,输入文件或文件夹名的文本框是灰色的,无法输入.请问该怎么解决? 答:打开注册表编辑器,定位到[HKEY_CU ...