Mina编解码工厂

前言:消息是编解码处理的主体对象,所以我们最应该事先定义好我们的业务实体对象。

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;
	}

}


转载于:https://my.oschina.net/boonya/blog/126893

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值