公司正在做一个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是一个Java开发的网络通信框架,广泛应用于TCP和UDP协议的服务器和客户端开发。在mina框架中,编解码器(Codec)扮演着至关重要的角色,它负责将应用层的数据转换为网络传输的字节...
在实际应用中,还需要考虑解码器(Decoder)的对应实现,确保服务器端能够正确解析累积后的大消息。同时,为了保证可靠性和安全性,需要对合并和序列化的过程进行错误处理,并可能需要实现一种机制来检测和恢复可能...
《MINA框架自定义解编码器的深度解析与实践》 MINA(Java Multithreaded Network Application ...简单_mina项目的实例为初学者提供了良好的学习起点,通过研究和实践,可以更深入地掌握MINA自定义解编码器的使用技巧。
7. **配置MINA**:在你的MINA服务端或客户端配置中,注册你的自定义编码器,这样MINA在处理数据时会自动调用你的编码逻辑。 通过这种方式,自定义编码器可以让你更灵活地控制数据在网络上的传输形式,以适应各种...
总的来说,Mina自定义协议通信示例是一个很好的学习资源,它涵盖了网络编程的核心概念,如事件驱动模型、非阻塞I/O和自定义编解码。通过深入理解并实践这个示例,开发者能更好地掌握Mina框架,并有能力解决复杂网络...
### Mina编码器详解 #### 一、引言 Mina是Apache下的一个高效、轻量级的网络通信框架,支持多种传输协议如TCP...开发者可以根据实际应用场景选择合适的编码策略,并结合Mina提供的工具类轻松实现高效的编码解码逻辑。
总结起来,MINA编解码器是MINA框架中实现网络通信数据转换的重要工具,通过编码器和解码器的配合,实现了数据在网络中的高效传输。在`mina_server`和`minaclient`的示例中,我们可以直观地看到编解码器在实际应用中...
**Mina自定义协议简单实现** Apache Mina(Minimum Asynchronous Network)是一个开源的网络通信框架,它为Java开发者提供了一种高效、灵活且可扩展的框架,用于构建高性能的网络应用程序,如服务器和客户端应用。...
在这个示例中,我们会设置一个`ProtocolCodecFilter`,它包含我们的自定义编码器和解码器。当服务器接收到数据时,`ProtocolDecoder`会将接收到的字节流转换成业务对象;当服务器需要发送数据时,`ProtocolEncoder`...
在这个场景中,"mina解码器"是指使用MINA框架来实现自定义的编码和解码逻辑,以处理网络数据的收发。 解码器(Decoder)和编码器(Encoder)是MINA框架中用于处理数据传输的核心组件。它们分别负责将接收到的原始...
在mina中,我们可以自定义解码器来处理特定的协议或数据格式。例如,如果我们的应用使用了某种特定的二进制协议,我们可以创建一个解码器来解析这种协议的数据包,并将其转换为对应的Java对象。 多路分离解码的工作...
通过上述内容,我们可以看出Apache Mina是一个强大且灵活的网络通信框架,它支持自定义协议设计和高效的编码解码机制,适用于多种类型的网络应用开发。在实践中,开发者可以根据具体需求,结合Mina提供的工具和接口...
为了解决这些问题,Mina提供了一些内置机制,如缓冲区管理和自定义编码解码器。 1. 缓冲区管理:Mina使用IoBuffer作为数据缓冲区,允许开发者对数据的读写进行精细控制。通过设置合适的缓冲区大小和正确地读写数据...
7. **自定义编码与解码**:如前所述,MINA支持自定义编解码器,允许开发者根据业务需求定制数据序列化和反序列化过程。 8. **社区支持**:MINA作为一个成熟的开源项目,拥有活跃的社区和丰富的文档,遇到问题时可以...
MINA提供了一套编码解码框架,开发者可以自定义编码解码器以适应特定的协议格式。 4. **Event Handler**:事件处理器接口,当网络事件发生时,MINA会调用相应的事件处理器方法。例如,`messageReceived()`方法会在...
总的来说,理解和处理Mina中的断包和粘包问题,需要深入理解网络通信协议、数据编码解码原理以及Mina框架的工作机制。通过分析Android-Mina-master项目中的代码,我们可以学习到如何在实际应用中解决这些问题,提高...
然后,自定义编解码器是Mina框架的一大亮点,它允许我们根据实际需求对数据进行编码和解码。在传输过程中,网络数据通常以字节流的形式进行交换,而我们需要将这些字节流转化为易于理解和处理的对象。Mina提供了...
Mina网络通信传输是基于Java开发的一个高性能、可伸缩的网络应用框架,常...通过自定义编码解码器和报头式协议,开发者可以灵活地设计和实现符合业务需求的通信协议,同时利用Mina的高级特性提高系统的性能和稳定性。
Apache Mina的IoFilter主要有以下作用:记录事件日志、测量系统性能、验证信息、过载控制以及信息的转换(例如编码和解码)。 要深入理解IoFilter,我们需从以下几个方面入手: 1. IoFilter的工作机制与应用场景 ...