`
thb143
  • 浏览: 8588 次
文章分类
社区版块
存档分类
最新评论

mina自定义编码解码器

 
阅读更多
公司正在做一个C/S的东西,其中用到了Mina框架,故对其中自定义编码解码器做了一些研究!
package net.xml;

import java.nio.charset.Charset;

import org.apache.log4j.Logger;

public class InfoXml {
	private static Logger logger = Logger.getLogger(InfoXml.class);
//	private short tag;
	private String xml;
	
	public short getTag(){
		return (short)0x0001;
	}
	
	public int getLen(Charset charset){
		int len = 0;
		try {
			len += xml.getBytes(charset).length;
		} catch (Exception e) {
			logger.error("数据错误", e);
			e.printStackTrace();
		}
		return len;
	}
	
//	public short getTag() {
//		return tag;
//	}
//	public void setTag(short tag) {
//		this.tag = tag;
//	}
	public String getXml() {
		return xml;
	}
	public void setXml(String xml) {
		this.xml = xml;
	}
	
}


重写解码编码方法
package net.xml;

import org.apache.mina.filter.codec.demux.DemuxingProtocolCodecFactory;
import org.apache.mina.filter.codec.demux.MessageDecoder;
import org.apache.mina.filter.codec.demux.MessageEncoder;

public class InfoMessageCodecFactory extends DemuxingProtocolCodecFactory{
	private MessageDecoder decoder;
	private MessageEncoder<InfoXml> encoder;
	
	public InfoMessageCodecFactory(MessageDecoder decoder,MessageEncoder<InfoXml> encoder){
		this.decoder = decoder;
		this.encoder = encoder;
		addMessageDecoder(this.decoder);
		addMessageEncoder(InfoXml.class, this.encoder);
	}
}


package net.xml;

import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;

import org.apache.log4j.Logger;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import org.apache.mina.filter.codec.demux.MessageDecoder;
import org.apache.mina.filter.codec.demux.MessageDecoderResult;

public class InfoMessageDecoder implements MessageDecoder{
	private static Logger logger = Logger.getLogger(InfoMessageDecoder.class);
	private Charset charset;
	public InfoMessageDecoder(Charset charset){
		this.charset = charset;
	}

	@Override
	public MessageDecoderResult decodable(IoSession session, IoBuffer in) {
		if(in.remaining() < 6){
			return MessageDecoderResult.NEED_DATA;
		}
		short tag = in.getShort();
		if (tag == (short)0x0001 || tag == (short)0x8001) {
			logger.info("请求标识符:" + tag);
		} else {
			logger.error("未知的解码类型....");
			return MessageDecoderResult.NOT_OK;
		}
		int len = in.getInt();
		if (in.remaining() < len) {
			return MessageDecoderResult.NEED_DATA;
		}
		return MessageDecoderResult.OK;
	}

	@Override
	public MessageDecoderResult decode(IoSession session, IoBuffer in,
			ProtocolDecoderOutput out) throws Exception {
		logger.info("解码: "+in.toString());
		CharsetDecoder decoder = charset.newDecoder();
		short tag = in.getShort();
		int len = in.getInt();
		byte[] temp = new byte[len];
		in.get(temp);
		
		IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true);
		buf.put(temp);
		buf.flip();
		
		InfoXml ix = new InfoXml();
		String xml = buf.getString(len, decoder);

		ix.setXml(xml);
		out.write(ix);
		return MessageDecoderResult.OK;
	}

	@Override
	public void finishDecode(IoSession session, ProtocolDecoderOutput out)
			throws Exception {
	}

}


package net.xml;

import java.nio.charset.Charset;

import org.apache.log4j.Logger;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
import org.apache.mina.filter.codec.demux.MessageEncoder;

public class InfoMessageEncoder implements MessageEncoder<InfoXml>{
	private static Logger logger = Logger.getLogger(InfoMessageEncoder.class);
	private Charset charset;
	
	public InfoMessageEncoder(Charset charset){
		this.charset = charset;
	}
	
	@Override
	public void encode(IoSession session, InfoXml ix, ProtocolEncoderOutput out)
			throws Exception {
		IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true);
		buf.putShort(ix.getTag());
		buf.putInt(ix.getLen(charset));
		buf.putString(ix.getXml(), charset.newEncoder());
		buf.flip();
		logger.info("编码" + buf.toString());
		out.write(buf);
	}

}


业务逻辑类
package net.xml;

import java.util.Iterator;

import org.apache.log4j.Logger;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;


public class InfoServerHandler extends IoHandlerAdapter{
	public static Logger logger = Logger.getLogger(InfoServerHandler.class);
    String commandText = null;
    String usernameText = null;
    String passwordText = null;

	@Override
	public void sessionCreated(IoSession session) throws Exception {
		logger.info("服务端与客户端创建连接...");
	}

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		logger.info("服务端与客户端连接打开...");
	}
	
	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		if (message instanceof InfoXml) {
			InfoXml ix = (InfoXml)message;
			String xml = ix.getXml();
			System.out.println("请求数据: "+xml);
			
			Document doc = DocumentHelper.parseText(xml);
			Element rootElt = doc.getRootElement(); // 获取根节点
	        System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称
	        Iterator it = rootElt.elementIterator();
	        while(it.hasNext()){
	        	it.next();
	        	commandText = rootElt.elementTextTrim("command"); 
	        	usernameText = rootElt.elementTextTrim("username");
	        	passwordText = rootElt.elementTextTrim("password");
	        }
	        StringBuffer sb = new StringBuffer(1000);
	        sb.append("<response>");
	        sb.append("<success>");
	        if ("login".equals(commandText)) {
	        	if ("abc".equals(usernameText) && "123".equals(passwordText)) {
	        		sb.append("true");
	        	} else {
	        		sb.append("false");
	        	}
	        }
	        sb.append("</success>");
	        sb.append("</response>");
	        
	        InfoXml res = new InfoXml();
//	        res.setTag((short)0x8001);
	        res.setXml(sb.toString());
	        
	        session.write(res);
		} else {
			logger.info("未知请求!");
		}
	}
		
	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		session.close();
		logger.info("服务端发送信息成功...");
	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {

	}

	@Override
	public void sessionIdle(IoSession session, IdleStatus status)
			throws Exception {
		logger.info("服务端进入空闲状态...");
	}

	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		logger.error("服务端发送异常...", cause);
	}
}


package net.xml;

import org.apache.log4j.Logger;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

public class InfoClientHandler extends IoHandlerAdapter{
	private static Logger logger = Logger.getLogger(InfoClientHandler.class);
	
	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		InfoXml ix = (InfoXml)message;
		String xml = ix.getXml();
		System.out.println("响应数据:"+xml);
	}
	
	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		logger.error("客户端发生异常...", cause);
	}
}


这个自定义编码解码,报头传递标识符和读取长度,然后是真实数据区,采用xml字符串传递!
分享到:
评论

相关推荐

    mina自定义编解码器详解

    **mina自定义编解码器详解** mina是一个Java开发的网络通信框架,广泛应用于TCP和UDP协议的服务器和客户端开发。在mina框架中,编解码器(Codec)扮演着至关重要的角色,它负责将应用层的数据转换为网络传输的字节...

    mina自定义编码器-自行做会话累积

    在实际应用中,还需要考虑解码器(Decoder)的对应实现,确保服务器端能够正确解析累积后的大消息。同时,为了保证可靠性和安全性,需要对合并和序列化的过程进行错误处理,并可能需要实现一种机制来检测和恢复可能...

    mina框架自定义解编码器

    《MINA框架自定义解编码器的深度解析与实践》 MINA(Java Multithreaded Network Application ...简单_mina项目的实例为初学者提供了良好的学习起点,通过研究和实践,可以更深入地掌握MINA自定义解编码器的使用技巧。

    mina自定义编码器-固定位置指定消息的长度

    7. **配置MINA**:在你的MINA服务端或客户端配置中,注册你的自定义编码器,这样MINA在处理数据时会自动调用你的编码逻辑。 通过这种方式,自定义编码器可以让你更灵活地控制数据在网络上的传输形式,以适应各种...

    Mina自定义协议通信的示例

    总的来说,Mina自定义协议通信示例是一个很好的学习资源,它涵盖了网络编程的核心概念,如事件驱动模型、非阻塞I/O和自定义编解码。通过深入理解并实践这个示例,开发者能更好地掌握Mina框架,并有能力解决复杂网络...

    mina编码器详解

    ### Mina编码器详解 #### 一、引言 Mina是Apache下的一个高效、轻量级的网络通信框架,支持多种传输协议如TCP...开发者可以根据实际应用场景选择合适的编码策略,并结合Mina提供的工具类轻松实现高效的编码解码逻辑。

    mina编解码器Demo

    总结起来,MINA编解码器是MINA框架中实现网络通信数据转换的重要工具,通过编码器和解码器的配合,实现了数据在网络中的高效传输。在`mina_server`和`minaclient`的示例中,我们可以直观地看到编解码器在实际应用中...

    Mina自定义协议简单实现

    **Mina自定义协议简单实现** Apache Mina(Minimum Asynchronous Network)是一个开源的网络通信框架,它为Java开发者提供了一种高效、灵活且可扩展的框架,用于构建高性能的网络应用程序,如服务器和客户端应用。...

    mina编解码示例

    在这个示例中,我们会设置一个`ProtocolCodecFilter`,它包含我们的自定义编码器和解码器。当服务器接收到数据时,`ProtocolDecoder`会将接收到的字节流转换成业务对象;当服务器需要发送数据时,`ProtocolEncoder`...

    mina解码器

    在这个场景中,"mina解码器"是指使用MINA框架来实现自定义的编码和解码逻辑,以处理网络数据的收发。 解码器(Decoder)和编码器(Encoder)是MINA框架中用于处理数据传输的核心组件。它们分别负责将接收到的原始...

    mina 多路分离解码

    在mina中,我们可以自定义解码器来处理特定的协议或数据格式。例如,如果我们的应用使用了某种特定的二进制协议,我们可以创建一个解码器来解析这种协议的数据包,并将其转换为对应的Java对象。 多路分离解码的工作...

    apache mina 框架实例

    通过上述内容,我们可以看出Apache Mina是一个强大且灵活的网络通信框架,它支持自定义协议设计和高效的编码解码机制,适用于多种类型的网络应用开发。在实践中,开发者可以根据具体需求,结合Mina提供的工具和接口...

    mina 断包,粘包问题解决

    为了解决这些问题,Mina提供了一些内置机制,如缓冲区管理和自定义编码解码器。 1. 缓冲区管理:Mina使用IoBuffer作为数据缓冲区,允许开发者对数据的读写进行精细控制。通过设置合适的缓冲区大小和正确地读写数据...

    给予mina 协议进行大数据传输

    7. **自定义编码与解码**:如前所述,MINA支持自定义编解码器,允许开发者根据业务需求定制数据序列化和反序列化过程。 8. **社区支持**:MINA作为一个成熟的开源项目,拥有活跃的社区和丰富的文档,遇到问题时可以...

    MINA源码与例子

    MINA提供了一套编码解码框架,开发者可以自定义编码解码器以适应特定的协议格式。 4. **Event Handler**:事件处理器接口,当网络事件发生时,MINA会调用相应的事件处理器方法。例如,`messageReceived()`方法会在...

    Mina断包,粘包处理(完整实例,有客户端,服务端)

    总的来说,理解和处理Mina中的断包和粘包问题,需要深入理解网络通信协议、数据编码解码原理以及Mina框架的工作机制。通过分析Android-Mina-master项目中的代码,我们可以学习到如何在实际应用中解决这些问题,提高...

    Mina框架使用demo

    然后,自定义编解码器是Mina框架的一大亮点,它允许我们根据实际需求对数据进行编码和解码。在传输过程中,网络数据通常以字节流的形式进行交换,而我们需要将这些字节流转化为易于理解和处理的对象。Mina提供了...

    Mina网络通信传输

    Mina网络通信传输是基于Java开发的一个高性能、可伸缩的网络应用框架,常...通过自定义编码解码器和报头式协议,开发者可以灵活地设计和实现符合业务需求的通信协议,同时利用Mina的高级特性提高系统的性能和稳定性。

    深入理解Apache Mina (2)---- 与IoFilter相关的几个类

    Apache Mina的IoFilter主要有以下作用:记录事件日志、测量系统性能、验证信息、过载控制以及信息的转换(例如编码和解码)。 要深入理解IoFilter,我们需从以下几个方面入手: 1. IoFilter的工作机制与应用场景 ...

Global site tag (gtag.js) - Google Analytics