package com.wzw.netty.codc.server;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.wzw.netty.constant.Constant;
import com.wzw.netty.model.MessageType;
import com.wzw.netty.model.RequestMessage;
import com.wzw.netty.model.request.RequestLinkAuth;
import com.wzw.netty.model.request.RequestLinkCheck;
import com.wzw.netty.model.request.RequestLinkDataCheck;
import com.wzw.netty.model.request.RequestLinkRel;
import com.wzw.netty.model.request.RequestNotifyXDRData;
import com.wzw.netty.model.request.RequestVerNego;
import com.wzw.netty.model.request.RequestXDRRawDataSend;
import com.wzw.netty.util.HexUtils;
public class ServerDecoder extends ByteToMessageDecoder {
private int i=0;
Logger logger = LoggerFactory.getLogger(ServerDecoder.class);
ByteBuf cache = Unpooled.buffer();
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf buffer,
List<Object> out) throws Exception {
// TODO Auto-generated method stub
logger.info("=============server start decode data==================");
if (buffer.readableBytes() < Constant.BASE_LENGTH) { //这个HEAD_LENGTH是我们用于表示头长度的字节数。 由于Encoder中我们传的是一个int类型的值,所以这里HEAD_LENGTH的值为4.
return;
}
buffer.markReaderIndex(); //我们标记一下当前的readIndex的位置
short totalLength = buffer.readShort(); // 读取传送过来的消息的长度。ByteBuf 的readShort()方法会让他的readIndex增加2
if (totalLength < 0) { // 我们读到的消息体长度为0,这是不应该出现的情况,这里出现这情况,关闭连接。
ctx.close();
}
if (buffer.readableBytes() < totalLength - 2) { //读到的消息体长度如果小于我们传送过来的消息长度,则resetReaderIndex. 这个配合markReaderIndex使用的。把readIndex重置到mark的地方
buffer.resetReaderIndex();
return;
}
// byte[] body = new byte[totalLength]; //传输正常
// buffer.readBytes(body);
short messageType = buffer.readShort();
int sequenceId = buffer.readInt();
byte totalContents = buffer.readByte();
logger.info("===========messageType:"+messageType+" sequenceId:"+sequenceId+" totalContents:"+totalContents+" totalLength:"+totalLength);
RequestMessage requestMessage = new RequestMessage();
//head 部分
requestMessage.setMessageType(messageType);
requestMessage.setSequenceId(sequenceId);
requestMessage.setTotalContents(totalContents);
requestMessage.setTotalLength(totalLength);
//body 部分
Object obj = handlerMethod(requestMessage,buffer);
out.add(obj);
}
private Object handlerMethod(RequestMessage requestMessage,ByteBuf buffer) {
// TODO Auto-generated method stub
if(requestMessage.getMessageType()==MessageType.verNego_Req.getType()){
return(verNegoRequestDecoder(requestMessage,buffer));
}
if(requestMessage.getMessageType()==MessageType.linkAuth_Req.getType()){
return(linkAuthRequestDecoder(requestMessage,buffer));
}
if(requestMessage.getMessageType()==MessageType.linkCheck_Req.getType()){
return(linkCheckRequestDecoder(requestMessage,buffer));
}
if(requestMessage.getMessageType()==MessageType.linkDataCheck_Req.getType()){
return(linkDataCheckRequestDecoder(requestMessage,buffer));
}
if(requestMessage.getMessageType()==MessageType.linkRel_Req.getType()){
return(linkRelRequestDecoder(requestMessage,buffer));
}
if(requestMessage.getMessageType()==MessageType.notifyXDRData_Req.getType()){
return(notifyXDRDataRequestDecoder(requestMessage,buffer));
// notifyXDRDataRequestDecoder(buffer,totalLength,messageType,sequenceId,totalContents);
}
if(requestMessage.getMessageType()==MessageType.XDRRawDataSend_Req.getType()){
return(XDRRawDataSendRequestDecoder(requestMessage,buffer));
}
return null;
}
/*
* @param buffer
* @param totalLength
* @param messageType
* @param sequenceId
* @param totalContents
* @return
*/
private RequestMessage linkCheckRequestDecoder(RequestMessage requestMessage,ByteBuf buffer) {
// TODO Auto-generated method stub
RequestLinkCheck requestLinkCheck = new RequestLinkCheck();
requestMessage.setBody(requestLinkCheck);
return requestMessage;
}
/**
* @param buffer
* @param totalLength
* @param messageType
* @param sequenceId
* @param totalContents
* @return
*/
private RequestMessage XDRRawDataSendRequestDecoder(RequestMessage requestMessage,ByteBuf buffer) {
// TODO Auto-generated method stub
RequestXDRRawDataSend xdrRawDataSend = new RequestXDRRawDataSend();
byte dst[] = new byte[requestMessage.getTotalLength()-Constant.BASE_LENGTH];
buffer.readBytes(dst);
xdrRawDataSend.setLoad(dst);
requestMessage.setBody(xdrRawDataSend);
return requestMessage;
}
/**
* @param buffer
* @param totalLength
* @param messageType
* @param sequenceId
* @param totalContents
* @return
*/
private RequestMessage notifyXDRDataRequestDecoder(RequestMessage requestMessage,ByteBuf buffer) {
// TODO Auto-generated method stub
RequestNotifyXDRData notifyXDRData = new RequestNotifyXDRData();
byte XDRType = buffer.readByte();
notifyXDRData.setXDRType(XDRType);
//去掉头消息和XDRType 的字节长度 剩下的是数据Load的长度
byte dst[] = new byte[requestMessage.getTotalLength()-Constant.BASE_LENGTH-1];
buffer.readBytes(dst);
String load = HexUtils.bytesToHexStringH(dst);
System.out.println("Load=======:"+load);
String lastLoad = HexUtils.convertHexToString(load);//16进制转10进制
System.out.println("lastLoad====="+lastLoad);
notifyXDRData.setLoad(lastLoad.getBytes());
//设置这次数据请求的数据量,用来下次数据链路检测的 RecDataInfo 数据赋值
notifyXDRData.setDataNum(buffer.readableBytes());
requestMessage.setBody(notifyXDRData);
return requestMessage;
}
/**
* @param buffer
* @param totalLength
* @param messageType
* @param sequenceId
* @param totalContents
* @return
*/
private RequestMessage linkRelRequestDecoder(RequestMessage requestMessage,ByteBuf buffer) {
// TODO Auto-generated method stub
RequestLinkRel requestLinkRel = new RequestLinkRel();
byte reason = buffer.readByte();
requestLinkRel.setReason(reason);
requestMessage.setBody(requestLinkRel);
return requestMessage;
}
/**
* @param buffer
* @param totalLength
* @param messageType
* @param sequenceId
* @param totalContents
* @return
*/
private RequestMessage linkDataCheckRequestDecoder(RequestMessage requestMessage,ByteBuf buffer) {
// TODO Auto-generated method stub
RequestLinkDataCheck requestLinkDataCheck = new RequestLinkDataCheck();
int Sendflag = buffer.readInt();
int SendDataInfo = buffer.readInt();
requestLinkDataCheck.setSendflag(Sendflag);
requestLinkDataCheck.setSendDataInfo(SendDataInfo);
requestMessage.setBody(requestLinkDataCheck);
return requestMessage;
}
/**
* @param buffer
* @param totalLength
* @param messageType
* @param sequenceId
* @param totalContents
* @return
*/
private RequestMessage linkAuthRequestDecoder(RequestMessage requestMessage,ByteBuf buffer) {
// TODO Auto-generated method stub
//LoginID
byte[] loginId = new byte[12];
buffer.readBytes(loginId);
//Digest
byte[] dst = new byte[64];
buffer.readBytes(dst);
String digest = HexUtils.bytesToHexStringH(dst);
System.out.println("digest====="+digest);
//Timestamp
int Timestamp = buffer.rea
没有合适的资源?快使用搜索试试~ 我知道了~
netty实现sdtp协议

共112个文件
svn-base:49个
java:46个
properties:5个

需积分: 50 39 下载量 81 浏览量
2018-12-25
15:38:00
上传
评论 4
收藏 85KB RAR 举报
温馨提示
netty实现sdtp协议,此demo通过netty高性能框架实现对接硬件设备的tcp通讯
资源推荐
资源详情
资源评论










收起资源包目录





































































































共 112 条
- 1
- 2
资源评论


你微笑莳很美丶
- 粉丝: 31
- 资源: 36
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
