Apache Mina自定义编解码案例
来源:互联网 发布:linux 内存历史记录 编辑:程序博客网 时间:2024/06/07 00:11
Mina中已经自带的编解码类:
TextLineCodecFactory:基于文本的,根据回车换行来断点传输数据
ProtocolCodecFactory:自定义协议的编解码数据传输
ObjectSerializationCodecFactory:对象序列化传输
DemuxingProtocolCodecFactory:复用传输
自定义通信协议:
FlightSearch 1.0 \n
startcity:BJS \n
endcity:PEK \n
flightway:1 \n
date:2011-08-10 \n
Domain对象
package domain;/** * @function : * @author :jy * @company :万里网 * @date :2011-8-7 */public class Flight {public String startCity;public String endCity;public String flightway;public String date;public String fromDate;public String subclass1;public String flight1;/** * 返回出发城市 * @return */public String getStartCity() {return startCity;}public void setStartCity(String startCity) {this.startCity = startCity;}/** * 返回到达城市 * @return */public String getEndCity() {return endCity;}public void setEndCity(String endCity) {this.endCity = endCity;}/** * 返回行程类型 * @return */public String getFlightway() {return flightway;}public void setFlightway(String flightway) {this.flightway = flightway;}/** * 返回出发日期 * @return */public String getDate() {return date;}public void setDate(String date) {this.date = date;}@Overridepublic String toString() {return "Flight [startCity=" + startCity + ", endCity=" + endCity + ", flightway=" + flightway + ", date="+ date + "]";}/** * 返回往返日期 * @return */public String getFromDate() {return fromDate;}public void setFromDate(String fromDate) {this.fromDate = fromDate;}public String getFlight1() {return flight1;}public void setFlight1(String flight1) {this.flight1 = flight1;}public String getSubclass1() {return subclass1;}public void setSubclass1(String subclass1) {this.subclass1 = subclass1;}}
服务器端编码
package server; 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; /** * @function : * @author :jy * @company :万里网 * @date :2011-8-7 */ public class FlightEncoder extends ProtocolEncoderAdapter { private final Charset charset = Charset.forName("UTF-8"); /* * 服务器端编码无需处理,直接将接收到的数据向下传递 */ @Override public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception { IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true); CharsetEncoder ce = charset.newEncoder(); buf.putString((String)message, ce); buf.flip(); out.write(buf); } }
重点是服务器端解码
package server; 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.ProtocolDecoderAdapter; import org.apache.mina.filter.codec.ProtocolDecoderOutput; import domain.Flight; /** * @function : * @author :jy * @company :万里网 * @date :2011-8-7 */ public class FlightDecoder extends CumulativeProtocolDecoder { @Override protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true); CharsetDecoder cd = Charset.forName("UTF-8").newDecoder(); int ColumnNumber = 0; String status="",startCity="",endCity="",flightway="",date=""; int TextLineNumber = 1; Flight flight = new Flight(); /** * FlightSearch 1.0 \n * startcity:BJS \n * endcity:PEK \n * flightway:1 \n * date:2011-08-10 \n */ while(in.hasRemaining()){ byte b = in.get(); buf.put(b); if(b == 10 && TextLineNumber <= 5){ ColumnNumber++; if(TextLineNumber == 1){ buf.flip(); status = buf.getString(ColumnNumber, cd); } if(TextLineNumber == 2){ buf.flip(); startCity = buf.getString(ColumnNumber, cd).split(":")[1]; startCity = startCity.substring(0, startCity.length()-1); flight.setStartCity(startCity); } if(TextLineNumber == 3){ buf.flip(); endCity = buf.getString(ColumnNumber, cd).split(":")[1]; endCity = endCity.substring(0, endCity.length()-1); flight.setEndCity(endCity); } if(TextLineNumber == 4){ buf.flip(); flightway = buf.getString(ColumnNumber, cd).split(":")[1]; flightway = flightway.substring(0, flightway.length()-1); flight.setFlightway(flightway); } if(TextLineNumber == 5){ buf.flip(); date = buf.getString(ColumnNumber, cd).split(":")[1]; date = date.substring(0, date.length()-1); flight.setDate(date); break; } ColumnNumber = 0; buf.clear(); TextLineNumber++; }else{ ColumnNumber++; } } out.write(flight); return false; } }
服务器端编解码工厂
package server; 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; /** * @function : * @author :jy * @company :万里网 * @date :2011-8-7 */ public class FlightCodecFactory implements ProtocolCodecFactory { private final ProtocolEncoder encoder = new FlightEncoder(); private final ProtocolDecoder decoder = new FlightDecoder(); @Override public ProtocolDecoder getDecoder(IoSession session) throws Exception { return decoder; } @Override public ProtocolEncoder getEncoder(IoSession session) throws Exception { return encoder; } }
下面是客户端的编解码
重点是编码,需要将数据组装成协议格式,发送给服务器
package client; 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 domain.Flight; /** * @function : * @author :jy * @company :万里网 * @date :2011-8-7 */ public class FlightClientEncoder extends ProtocolEncoderAdapter { private final Charset charset; public FlightClientEncoder(){ this.charset = Charset.forName("UTF-8"); } @Override public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception { Flight flight = (Flight)message; IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true); CharsetEncoder ce = charset.newEncoder(); buf.putString("Flight Search 1.0" + '\n', ce); buf.putString("startcty:" + flight.getStartCity() + '\n', ce); buf.putString("endcity:" + flight.getEndCity() + '\n', ce); buf.putString("flightway:" + flight.getFlightway() + '\n', ce); buf.putString("date:" + flight.getDate() + '\n', ce); buf.flip(); out.write(buf); } }
解码无需特殊处理,接收完数据直接向下传递
package client; 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; /** * @function : * @author :jy * @company :万里网 * @date :2011-8-7 */ public class FlightClientDecoder extends CumulativeProtocolDecoder { /* (non-Javadoc) * @see org.apache.mina.filter.codec.ProtocolDecoder#decode(org.apache.mina.core.session.IoSession, org.apache.mina.core.buffer.IoBuffer, org.apache.mina.filter.codec.ProtocolDecoderOutput) */ @Override protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { CharsetDecoder cd = Charset.forName("UTF-8").newDecoder(); IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true); while(in.hasRemaining()){ buf.put(in.get()); } buf.flip(); out.write(buf.getString(cd)); return false; } }
客户端编解码工厂
package client; 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; /** * @function : * @author :jy * @company :万里网 * @date :2011-8-7 */ public class FlightClientCodecFactory implements ProtocolCodecFactory { private final ProtocolEncoder encoder = new FlightClientEncoder(); private final ProtocolDecoder decoder = new FlightClientDecoder(); /* (non-Javadoc) * @see org.apache.mina.filter.codec.ProtocolCodecFactory#getDecoder(org.apache.mina.core.session.IoSession) */ @Override public ProtocolDecoder getDecoder(IoSession arg0) throws Exception { return decoder; } /* (non-Javadoc) * @see org.apache.mina.filter.codec.ProtocolCodecFactory#getEncoder(org.apache.mina.core.session.IoSession) */ @Override public ProtocolEncoder getEncoder(IoSession arg0) throws Exception { return encoder; } }
转载地址:http://blog.csdn.net/a600423444/article/details/6671035
- Apache Mina自定义编解码案例
- Apache Mina自定义编解码案例 .
- Apache Mina自定义编解码案例
- Apache Mina自定义编解码案例
- Apache Mina自定义编解码案例 .
- mina自定义编解码
- Nio 框架 Apache Mina 2 总结(自定义编解码)
- Mina自定义文本编解码
- Mina框架----自定义编解码(转http://www.congci.com/item/apache-mina-zidingyi-bianjiema)
- Apache Mina server简单编解码实现
- APACHE MINA之自定义CODEC(编码/解码)
- 深入解析Apache Mina源码(4)——Mina编解码以及对粘包和断包的处理
- Mina实现传输对象的编解码
- Apache Mina 自定义协议
- apache mina 自定义协议
- mina框架分析:自定义编码解码
- Mina Codec Filter对应协议实现编解码处理
- Apache Mina框架UDP测试案例--->java
- Four Steps to Google, Without a Degree
- FreeBSD 9.0+XFCE4
- 最近公共祖先(least common ancestors algorithm)
- 矩阵乘法的优化
- 追她那点事(一)
- Apache Mina自定义编解码案例
- Linux/Mac OS 个人常用Terminal技巧整理
- mac终端命令大全 苹果入门
- 【fraud detection】秒针系统发布《互联网广告反作弊技术白皮书》
- 排序算法-插入算法
- 【fraud detection】从“秒杀门”看网络防作弊
- 程序员:下一次面试前你需要准备的五个基本步骤
- 【fraud detection】点击欺诈丛生 中国互联网广告一场骗局
- 【fraud detection】点击量作弊——互联网广告业的附骨之蛆!