前言:消息是编解码处理的主体对象,所以我们最应该事先定义好我们的业务实体对象。
1、消息对象
package com.boonya.protocol.message;
public class MyMessage {
private String sender;
private String receiver;
private String message;
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2、编码
package com.boonya.protocol.codec;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
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;
import com.boonya.protocol.message.MyMessage;
public class MyEncoder extends ProtocolEncoderAdapter{
private final Charset charset;
public MyEncoder(Charset charset) {
this.charset = charset;
}
@Override
public void encode(IoSession session, Object message, ProtocolEncoderOutput out)
throws Exception {
//编码对象
MyMessage smsObj=(MyMessage) message;
//获取编码器
CharsetEncoder encoder=charset.newEncoder();
//设置容量和允许扩展
IoBuffer buffer=IoBuffer.allocate(100).setAutoExpand(true);
//设置消息体
String statusLine="M sip:wap.fetion.com.cn SIP/C 2.0";
String sender=smsObj.getSender();
String receiver=smsObj.getReceiver();
String smsContent=smsObj.getMessage();
buffer.putString(statusLine+"\n", encoder);
buffer.putString("S:"+sender+"\n", encoder);
buffer.putString("R:"+receiver+"\n", encoder);
buffer.putString("L:"+(smsContent.getBytes().length)+"\n", encoder);//消息的长度
buffer.putString(smsContent, encoder);
buffer.flip();
out.write(buffer);
}
}
3、解码
package com.boonya.protocol.codec;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import com.boonya.protocol.message.MyMessage;
public class MyDecoder extends CumulativeProtocolDecoder{
private final Charset charset;
public MyDecoder(Charset charset) {
this.charset = charset;
}
@Override
protected boolean doDecode(IoSession session, IoBuffer in,
ProtocolDecoderOutput out) throws Exception {
// TODO Auto-generated method stub
//创建解码器
CharsetDecoder decoder=charset.newDecoder();
//设置容量和允许动态扩容
IoBuffer buffer=IoBuffer.allocate(100).setAutoExpand(true);
//消息处理
String statusLine="",sender="",receiver="",length="",msg="";
int matchCount=0;
int i=1;
while (in.hasRemaining()) {
byte b=in.get();
buffer.put(b);
if(b==10&&i<5){
matchCount++;
if(i==1){
buffer.flip();
statusLine=buffer.getString(matchCount, decoder);
statusLine=statusLine.substring(0, statusLine.length()-1);
matchCount=0;
buffer.clear();
}
if(i==2){
buffer.flip();
sender=buffer.getString(matchCount, decoder);
sender=sender.substring(0, sender.length()-1);
matchCount=0;
buffer.clear();
}
if(i==3){
buffer.flip();
receiver=buffer.getString(matchCount, decoder);
receiver=receiver.substring(0, receiver.length()-1);
matchCount=0;
buffer.clear();
}
if(i==4){
buffer.flip();
length=buffer.getString(matchCount, decoder);
length=length.substring(0, length.length()-1);
matchCount=0;
buffer.clear();
}
i++;
}else if(i==5){
matchCount++;
if(matchCount==Long.parseLong(length.split(":")[1])){
buffer.flip();
msg=buffer.getString(matchCount, decoder);
buffer.clear();
i++;
break;
}
}else{
matchCount++;
}
}
MyMessage smsObj=new MyMessage();
smsObj.setSender(sender.split(":")[1]);
smsObj.setReceiver(receiver.split(":")[1]);
smsObj.setMessage(msg);
out.write(smsObj);
return false;
}
}
4、编解码工厂
package com.boonya.protocol.codec;
import java.nio.charset.Charset;
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;
public class MyCodecFactory implements ProtocolCodecFactory{
private final MyEncoder encoder;
private final MyDecoder decoder;
public MyCodecFactory() {
this(Charset.defaultCharset());
}
public MyCodecFactory(Charset charset) {
this.encoder = new MyEncoder(charset);
this.decoder = new MyDecoder(charset);
}
@Override
public ProtocolDecoder getDecoder(IoSession session) throws Exception {
// TODO Auto-generated method stub
return this.decoder;
}
@Override
public ProtocolEncoder getEncoder(IoSession session) throws Exception {
// TODO Auto-generated method stub
return this.encoder;
}
}