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的更多相关文章

  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. yum添加网易和搜狐源

    先进入yum源配置目录 cd /etc/yum.repos.d 备份系统自带的yum源 mv CentOS-Base.repo CentOS-Base.repo.save 163的yum源: wget ...

  2. .NET文件上传的大小限制配置

    <system.web>  <!--maxRequestLength单位是Kb-->  <httpRuntime maxRequestLength="20971 ...

  3. webservice接口的发布

    使用xfire-client发布webservice接口: commons-codec-1.3.jar commons-httpclient-3.0.jar 在src 下创建META-INF/xfir ...

  4. jQuery 的选择器

    本文来自网上转帖 1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择ID为divId的元素 element 根据元素的名称选择, ...

  5. C#中的Collection 3

    IList<T> 和 ICollection<T> 最重要的一些类型 List<T>: Encapsulates[T], like array, but also ...

  6. Labeled ContentControl & LabeledControl【项目】

    LabeledTextBoxControl: C#定义 using System; using System.Collections.Generic; using System.Linq; using ...

  7. PHP函数前面的@。

    @是可以屏蔽函数执行过程中遇到问题而产生的一些错误.警告信息,这样用户就看不到程序的出错信息.这样除了用户界面会友好一些外,更重要的是安全性,因为屏蔽了出错文件的路径等信息. 比如说这个: for($ ...

  8. Cache 工具类

    package com.thinkgem.jeesite.common.utils; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheM ...

  9. word wrap 解惑

    源起 我们经常需要“修复”一个老生常谈的“bug”,那就是文本的自动换行问题.在专业术语上,这种期望得到的渲染现象被称作“word wrap”,即文本处理器有能力把超出页边的整个词自动传到下一行. 在 ...

  10. centos7.2安装配置

    VMware12上安装Centos7,如果电脑是64位,这必须选择64位的centos系统,不然安装完会找不到网卡.安装过程中应当开启网卡选项. 安装完想用ifconfig命令查找IP地址会提示错误: ...