博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用mina解析http协议的使用
阅读量:6714 次
发布时间:2019-06-25

本文共 5379 字,大约阅读时间需要 17 分钟。

在使用mina的过程中,我们通常会自定义各种报文,以使用于自己的业务。今天就为大家带来一款类似http协议的解码过程。
mina有自带的解析http数据包的解码类。可以使用maven配置一下内容获取源码:
org.apache.mina
mina-http
3.0.0-M2
或者下载mina的源码包,查看org.apache.mina.http.HttpServerDecoder类。下面为自己写的解析方法:
package com.server;import java.lang.reflect.Method;import java.nio.charset.Charset;import org.apache.commons.lang3.StringUtils;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.CumulativeProtocolDecoder;import org.apache.mina.filter.codec.ProtocolDecoderOutput;import org.apache.mina.filter.codec.textline.LineDelimiter;/** * 解码HTTP协议类 * @author Herman.xiong * @date 2015年7月16日09:36:59 * @version V3.0 * @since Tomcat6.0,Jdk1.6 * @copyright Copyright (c) 2015 */public class HttpServerDecoder extends CumulativeProtocolDecoder {	private static final Logger log = Logger.getLogger(HttpServerDecoder.class);	private LineDelimiter codecLineDelimiter = null;	private Charset charset = null;	private static final String MessageLength = "MessageLength";	public HttpServerDecoder(Charset charset, LineDelimiter codecLineDelimiter) {		this.charset = charset;		this.codecLineDelimiter = codecLineDelimiter;	}	public Charset getCharset() {		return charset;	}	public void setCharset(Charset charset) {		this.charset = charset;	}	public LineDelimiter getCodecLineDelimiter() {		return codecLineDelimiter;	}	public void setCodecLineDelimiter(LineDelimiter codecLineDelimiter) {		this.codecLineDelimiter = codecLineDelimiter;	}		public static void main(String [] args){		IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(true);		Charset charset = Charset.forName("UTF-8");		CharsetEncoder ce=charset.newEncoder();		HttpServerDecoder socket=new HttpServerDecoder(Charset.forName("UTF-8"),LineDelimiter.CRLF);		try{			System.out.println("测试数据,测试数据".getBytes(charset).length);			buf.putString("MessageMethod:UserAction", ce);			buf.putString(LineDelimiter.CRLF.getValue(), ce);			buf.putString("MessageType:GET", ce);			buf.putString(LineDelimiter.CRLF.getValue(), ce);			buf.putString("Content-Type:text/html; charset=iso-8859-1", ce);			buf.putString(LineDelimiter.CRLF.getValue(), ce);			buf.putString("Connection:keep-alive", ce);			buf.putString(LineDelimiter.CRLF.getValue(), ce);			buf.putString("Keep-Alive:200", ce);			buf.putString(LineDelimiter.CRLF.getValue(), ce);						buf.putString("CompressType:jzip", ce);			buf.putString(LineDelimiter.CRLF.getValue(), ce);			buf.putString("Params:id=1&uid=2&name=3", ce);			buf.putString(LineDelimiter.CRLF.getValue(), ce);			buf.putString("accept-ranges:bytes", ce);			buf.putString(LineDelimiter.CRLF.getValue(), ce);			buf.putString("DateTime:DateTime", ce);			buf.putString(LineDelimiter.CRLF.getValue(), ce);			buf.putString("MessageLength:27", ce);			buf.putString(LineDelimiter.CRLF.getValue(), ce);			//body			buf.putString("测试数据,测试数据", ce);			buf.putString(LineDelimiter.CRLF.getValue(), ce);			buf.flip();			System.out.println("输出的内容为:"+buf.getString(charset.newDecoder()));			buf.flip();			socket.doDecode(null,buf,null);		}catch(Exception e){			e.printStackTrace();		}	}			/**	 * 数据包解码	 */	protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {		Map
map = (Map
) session.getAttribute("pocket"); IoBuffer buf = (IoBuffer)session.getAttribute("pocket_state"); if(null ==buf) buf = IoBuffer.allocate(100).setAutoExpand(true).setAutoShrink(true); if(null == map) map = new HashMap
(); Integer len = 0; while (in.hasRemaining()) { len = 0; byte b = in.get(); switch (b){ case '\r': buf.put(b); break; case '\n': buf.put(b); buf.flip(); String msg=buf.getString(charset.newDecoder()); String[] arr = msg.split(":"); if(StringUtils.isEmpty(map.get("MessageLength"))){ if (2 == arr.length && StringUtils.isNotEmpty(arr[0]) && StringUtils.isNotEmpty(arr[1])) { map.put(arr[0],arr[1]); } else { log.error("收到的数据包中存在非法内容!"); } if(Constant.HUPU_ZERO.equals(map.get("MessageLength"))){ out.write(map); if(in.position()==in.limit()){ session.setAttribute("pocket_state", null); session.setAttribute("pocket",null); return true; } map = new HashMap
(); } }else{ map.put(StringUtils.isEmpty(map.get("MessageContent"))?msg:map.get("MessageContent")+msg); len=((null == map.get("MessageContent")) ? StringUtils.EMPTY : String.valueOf(map.get("MessageContent"))).getBytes(charset).length; if(len==Integer.parseInt(map.get("MessageContent"))+2){ out.write(map); if(in.position()==in.limit()){ session.setAttribute("pocket_state", null); session.setAttribute("pocket",null); return true; } } map = new HashMap
(); } buf.clear(); break; default: buf.put(b); } } if(StringUtils.isEmpty(map.get("MessageLength")) || len
欢迎大家关注我的博客!如有疑问,请加QQ群:454796847共同学习!

转载地址:http://rxrlo.baihongyu.com/

你可能感兴趣的文章
django 反向关联--blog.entry_set.all()查询
查看>>
网工之路
查看>>
linux 查看发行版本信息
查看>>
数据结构之二叉树遍历
查看>>
Linux rpm 命令参数使用详解[介绍和应用]
查看>>
tr的使用详解
查看>>
CentOS 6.4下PXE+Kickstart无人值守安装操作系统
查看>>
2.5 alias命令
查看>>
arp
查看>>
小博浅谈MVC
查看>>
前端技术学习之选择器(四)
查看>>
Ubuntu与windows的远程控制/远程桌面
查看>>
2016年4月4日中项作业
查看>>
ARP欺骗
查看>>
Oracle专题12之游标
查看>>
两句话笔记--架构学习之一:并发基础课程(2)
查看>>
使用andbug的monitor命令
查看>>
CentOS/RedHat上安装man手册
查看>>
我的友情链接
查看>>
log4j配置
查看>>