Mina自定义编码2
来源:互联网 发布:做账软件试用 编辑:程序博客网 时间:2024/04/28 06:54
转 http://www.cnblogs.com/suifengbingzhu/archive/2012/08/20/2648292.html
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;
}
}
重写解码编码方法
Java代码
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);
}
}
Java代码
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);
//个人感觉蓝色部分可以优化为 String xml= new String(bytContent, 0, len,decoder);
ix.setXml(xml);
out.write(ix);
return MessageDecoderResult.OK;
}
@Override
public void finishDecode(IoSession session, ProtocolDecoderOutput out)
throws Exception {
}
}
Java代码
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);
}
}
业务逻辑类
Java代码
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);
}
}
Java代码
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);
}
}
- Mina自定义编码2
- mina框架分析:自定义编码解码
- APACHE MINA之自定义CODEC(编码/解码)
- mina仿qq聊天功能,自定义协议,协议的编码和解码详解,发送xml对象json,mina开发大全,详细api,mina心跳
- Apache Mina 自定义协议
- apache mina 自定义协议
- 自定义Mina编解码器
- mina自定义编解码
- Nio 框架 Apache Mina 2 总结(自定义编解码)
- mina的编码和解码以及断包的处理,发送自定义协议,仿qq聊天,发送xml或json
- Mina自定义文本编解码
- mina 自定义包的解析
- 自定义Mina中的拦截器
- mina框架自定义解编码器
- Mina 2 编码解码协议 及 已经实现通信的完整代码
- 有关apache mina框架的编码问题
- apache MINA框架的编码问题
- MINA源码分析---base64编码和解码
- python错误:TypeError: string indices must be integers
- [android][eclipse]eclipse 中android 开发配置环境基本设置
- Spring框架学习【Spring HTTP调用器实现远程调用】
- Xcode使用git
- 黑马程序员---学习枚举类型应该如何使用
- Mina自定义编码2
- python 网络编程笔记
- 待学习:高并发高流量网站架构(解决方案)
- 批处理程序常用小工具
- 用Detours实现APIHOOK
- [Java] 动态代理 04 - 想实现什么功能,就实现什么功能
- 直接拿来用,最火的.NET开源项目(beta)
- 安卓各文件存储路径汇总(Android file path)
- ADT 启动出现“fail to create the java virtual machine”解决方案