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 ...
随机推荐
- sql查找字符串是否包含字符
SELECT [Fgoodsid] ,[Fgoodsname] ,[Fcinema] ,[Fprice] FROM [tenpaytest].[dbo].[goodsinfo]where Fgoods ...
- openfire搭建IM
1.openfire 安装配置 在官网上下载,下载最新版本. 在数据库配置方面: 驱动:net.sourceforge.jtds.jdbc.Driver数据库连接:jdbc:jtds:sqlserve ...
- wikioi 1083 Cantor表
题目描述 Description 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 - 2/1 2/ ...
- 毕业设计--天气预报App
9月中旬,开始动手做我的毕业设计了,之前一直在纠结做啥,后来想想,既然是做毕业设计,那就大胆地做点自己没接触过的东西吧.然后网上查找资料得知做天气预报需要用到开放的API,而且要用那种现在还在维护的, ...
- 面向过程MySQL数据库链接操作
刚好今天复习到这个章节,将就发布出来,就当是为自己复习了 //链接数据库 $link = mysqli_connect('localhost/IP地址','用户名','密码','数据库名'); //设 ...
- 用jQuery解决弹出层的问题
在BS 项目中 经常需要用到这种弹出层.做这种弹出层一般都会遇到下面几个问题:0,弹出层必须定义在input的下边显示.1,点击input弹出div层.2,点击div层外面任何地方,关闭div层.3, ...
- [CentOS]yum安装postgres和ntfs-3g
卸载已经存在的postgreSql yum list | grep postgresyum remove postgresql-server 获取rpm文件并安装rpm -i http://yum.p ...
- android用NDK编译出so最简单的方法
其实只要是有个jni的文件夹,再放个Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hell ...
- C#缩放和裁剪图片
在GDI+中,缩放和剪裁可以看作同一个操作,无非就是原始区域的选择不同罢了.空口无凭,先看具体算法可能更好理解. using System; using System.Collections.Gene ...
- windows7添�windows2008R2域配置
server端配置: windows2008R2 WIN+R -> dcmopro -> 下一步 -> .... client配置: windows7 配置 DNS,如图: 计算机 ...