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

35 篇文章 0 订阅
34 篇文章 16 订阅

发布一个k8s部署视频:https://edu.csdn.net/course/detail/26967

课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。

腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518

第二个视频发布  https://edu.csdn.net/course/detail/27109

腾讯课堂连接地址https://ke.qq.com/course/484107?tuin=ba64518

介绍主要的k8s资源的使用配置和命令。包括configmap,pod,service,replicaset,namespace,deployment,daemonset,ingress,pv,pvc,sc,role,rolebinding,clusterrole,clusterrolebinding,secret,serviceaccount,statefulset,job,cronjob,podDisruptionbudget,podSecurityPolicy,networkPolicy,resourceQuota,limitrange,endpoint,event,conponentstatus,node,apiservice,controllerRevision等。

第三个视频发布:https://edu.csdn.net/course/detail/27574

详细介绍helm命令,学习helm chart语法,编写helm chart。深入分析各项目源码,学习编写helm插件


————————————————

废话不多,直接贴代码

 

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字段值错误");
		}
	}
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值