fix协议封装挑战-mina服务器的编解码器

原创 2013年12月03日 11:19:35

废话不多,直接贴代码

package cs.mina.codec;

import java.nio.charset.Charset;

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;

/*
 *@author(huangxiaoping)
 *@date 2013-10-24
 */
public class CsFixProtocolCodecFactory implements ProtocolCodecFactory {
	private CsFixProtocolDecoder decoder;
	private CsFixProtocolEncoder encoder;
	
	public CsFixProtocolCodecFactory(Charset charset){
		decoder= new CsFixProtocolDecoder(charset);
		encoder=new CsFixProtocolEncoder(charset);
	}
	@Override
	public ProtocolDecoder getDecoder(IoSession arg0) throws Exception {
		
		return decoder;
	}

	@Override
	public ProtocolEncoder getEncoder(IoSession arg0) throws Exception {
		
		return encoder;
	}

}

package cs.mina.codec;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolDecoderAdapter;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;

import cs.mina.SeqenceNum;
import cs.mina.codec.msg.BaseMsg;
import cs.mina.codec.msg.MsgFactory;
import cs.mina.codec.msg.MsgUtil;
import cs.mina.codec.msg.decoder.MsgDecoderFactory;
import cs.mina.exception.InValidDataException;

/*
 *@author(huangxiaoping)
 *@date 2013-10-24
 */
public class CsFixProtocolDecoder  extends ProtocolDecoderAdapter {
	private final Charset charset;
	private List<String> incorrectMsgList=new ArrayList<String>();
	private boolean isChunked=false;
	public CsFixProtocolDecoder(Charset charset){
		this.charset=charset;
	}
	@Override
	public void decode(IoSession arg0, IoBuffer arg1, ProtocolDecoderOutput arg2)
			throws Exception {
		String input=arg1.getString(charset.newDecoder());
		System.out.println(input);
		int index=input.indexOf(BaseMsg.SOH, input.indexOf(BaseMsg.SOH+"10=")+1);
		List<String> msgList=new ArrayList<String>();
		
		synchronized (this) {
			if(input.lastIndexOf(BaseMsg.SOH+"10=")!=(input.length()-8)||!input.endsWith(BaseMsg.SOH)){
				isChunked=true;
				incorrectMsgList.add(input);
			}else if(input.lastIndexOf(BaseMsg.SOH+"10=")==(input.length()-8)&&input.startsWith("8=")&&input.indexOf("9=")<15&&input.indexOf("35=")<25){
				msgList.add(input.substring(0, index+1));
				while((index+1)!=input.length()){
					input=input.substring(index+1);
					index=input.indexOf(BaseMsg.SOH, input.indexOf(BaseMsg.SOH+"10=")+1);
					msgList.add(input.substring(0, index+1));
				}
			}else if(isChunked){
				isChunked=false;
				String concat="";
				for(int i=0;i<incorrectMsgList.size();i++){
					concat+=incorrectMsgList.get(i);
				}
				concat+=input;
				int indexIncorrect=concat.indexOf(BaseMsg.SOH, concat.indexOf(BaseMsg.SOH+"10=")+1);
				msgList.add(concat.substring(0, indexIncorrect+1));
				while((indexIncorrect+1)!=concat.length()){
					concat=concat.substring(indexIncorrect+1);
					indexIncorrect=concat.indexOf(BaseMsg.SOH, concat.indexOf(BaseMsg.SOH+"10=")+1);
					msgList.add(concat.substring(0, indexIncorrect+1));
					
				}
				for(int i=0;i<incorrectMsgList.size();i++){
					incorrectMsgList.remove(i);
				}
			}else{
				throw new Exception("数据包错误"+input);
			}
		}
		
	    if(!isChunked){
	    	for(int i=0;i<msgList.size();i++){
				SeqenceNum.increaseNextSeqNum();
				String str=msgList.get(i);
				input=str;
				str=str.substring(0, str.indexOf(BaseMsg.SOH+"10=")+1);
				String checkSum=MsgUtil.checkSum(str);
				String msgType=input.substring(input.indexOf(BaseMsg.SOH+"35=")+1);
				msgType=msgType.substring(msgType.indexOf("=")+1,msgType.indexOf(BaseMsg.SOH));
				String type=msgType;
				BaseMsg baseMessage=MsgFactory.getMsg(type);
				String[]msgArray=MsgUtil.seperate(input);
				baseMessage.setHead(msgArray[0]);
				baseMessage.setBody(msgArray[1]);
				baseMessage.setTailer(msgArray[2]);
				baseMessage.decode();
				baseMessage.validate();
				if(!checkSum.equals(baseMessage.getTailerEntity().getCheckSum().getTagValue())){
					throw new InValidDataException("checksum字段值错误");
				}
				
				arg2.write(baseMessage);
			}
	    }
		
		
		
	}

}

package cs.mina.codec;

import java.nio.charset.Charset;

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 cs.mina.MessageMap;
import cs.mina.SeqenceNum;
import cs.mina.codec.msg.BaseMsg;
import cs.mina.codec.msg.MsgUtil;
import cs.mina.codec.msg.decoder.MsgDecoder;
import cs.mina.codec.msg.decoder.MsgDecoderFactory;
import cs.mina.codec.msg.encoder.MsgEncoder;
import cs.mina.codec.msg.encoder.MsgEncoderFactory;
import cs.mina.exception.InValidDataException;

/*
 *@author(huangxiaoping)
 *@date 2013-10-24
 */
public class CsFixProtocolEncoder extends ProtocolEncoderAdapter {
	private final Charset charset;
	public CsFixProtocolEncoder(Charset charset){
		this.charset=charset;
	}
	@Override
	public void encode(IoSession arg0, Object arg1, ProtocolEncoderOutput arg2)
			throws Exception {
		//SeqenceNum.increaseSeqNum();
		BaseMsg message=(BaseMsg)arg1;
		MessageMap.addMsg(message);
		message.validate();
		//MsgEncoder encoder=MsgEncoderFactory.getEncoder(message.getHeadEntity().getMsgType().getTagValue());
		String str=message.encode();
		message.getHeadEntity().getBodyLength().setTagValue(getBodyLength(str));
		str=message.encode();
		String result=str;
		validateLen(str);
		str=str.substring(0, str.indexOf(BaseMsg.SOH+"10=")+1);
		String checkSum=MsgUtil.checkSum(str);
		message.getTailerEntity().getCheckSum().setTagValue(checkSum);
		result=message.encode();
		System.out.println(result);
		IoBuffer io = IoBuffer.allocate(result.getBytes().length);
		io.put(result.getBytes());
		io.flip();
		arg2.write(io);

	}

	private String getBodyLength(String msg){
		String m1=msg.substring(msg.indexOf(BaseMsg.SOH+"9=")+1);
		String m2=m1.substring(m1.indexOf(BaseMsg.SOH)+1);
		String m3=m2.substring(0,m2.indexOf(BaseMsg.SOH+"10=")+1);
		return m3.length()+"";
	}
	
	private void validateLen(String msg){
		String m1=msg.substring(msg.indexOf(BaseMsg.SOH+"9=")+1);
		String r1=m1.substring(2, m1.indexOf(BaseMsg.SOH));
		String m2=m1.substring(m1.indexOf(BaseMsg.SOH)+1);
		String m3=m2.substring(0,m2.indexOf(BaseMsg.SOH+"10=")+1);
		if( !(m3.length()==Integer.parseInt(r1))){
			throw new InValidDataException("BodyLength字段值错误");
		}
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

fix协议封装挑战

最近在做金融项目,用到了fix协议,是么是fix协议我就不多说了,由我一个人去封装这个庞然大物,当然很多没用到的我们暂时没封装进去。 下面是我的思路。 msg由个基类BaseMsg compon...

金融信息交换协议(FIX)5.0 FIXT1.1(1)

下一篇金融信息交换协议(FIX)

QuickFix Fix协议实现配置(一)

Fix协议,有现成的QuickFix,拿来就可以用,不过要上手也要了解一下FIX协议,入手: settings_ = new FIX::SessionSettings(p.s...

用Quickfix详解Fix(二)--运行源码

序言: 在初探Fix(一),我们运行了安装包自带的例子,本篇我们来一起让例子的程序源代码在Eclipse中运行起来,然后在以后的篇幅中,我会结合源代码来详细介绍Fix 协议的在QuickFix的实现...

Spring Boot下Druid连接池的使用配置分析

引言: 在Spring Boot下默认提供了若干种可用的连接池,Druid来自于阿里系的一个开源连接池,在连接池之外,还提供了非常优秀的监控功能,这里讲解如何与Spring Boot实现集成。 1. ...

fix协议封装挑战-数据库脚本

declare @tname varchar(8000) set @tname='' select @tname=@tname+Name+','from sysobjects where xtype=...

金融信息交换协议(FIX)

原文地址: http://blog.csdn.net/great3779/article/details/8585518 随着网络的使用,目前所有大型的金融机构都已经实现了自动...

用Quickfix详解Fix(三)---概念性基础

经过前面2篇文章,我们已经看到QuickFix 运行效果了,那么我们接下来就要结合QuickFix 实现来详解Fix 协议,因为FixClub 的宗旨是让人了解,熟悉Fix 协议。不是让人去单单理解一...

用Quickfix详解Fix(一)--下载安装

(一) 前言 QuickFix 是Fix开源引擎,目前很多Fix解决方案都是根据或参考QuickFix实现的,尤其在中国市场,基本全部或大部分都是QuickFix的包装产品,所以QuickFix是作...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)