原文链接:http://www.xuebuyuan.com/1158838.html
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);
}
三、如果是以下一种特殊的情况呢?
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;
}
}