📄 zfdecoder.java
字号:
package com.frontMachine.codec;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.UnmappableCharacterException;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.codec.demux.MessageDecoderResult;
import org.apache.mina.util.CharsetUtil;
import com.frontMachine.setting.ServerSetting;
import com.frontMachine.util.ErrMsg;
import com.frontMachine.util.ExceptionLoger;
/**
* @转发服务解码器
* @author LRT
* @version 1.0
*/
public class ZFDecoder extends AbstractDecoder
{
public static Logger logger;
static
{
logger = Logger.getLogger(ZFDecoder.class);
String regular_string=ServerSetting.getInstance().getRegularExp();
pattern= Pattern.compile(regular_string);
String charset_name= ServerSetting.getInstance().getDeCharset();
if(charset_name!=null)
{
charset=Charset.forName(charset_name);
}
else
{
System.out.println("get defaultcharset!!");
charset=CharsetUtil.getDefaultCharset();
}
}
public ZFDecoder()
{
}
public MessageDecoderResult decodable( IoSession session, ByteBuffer in )
{
byte[] b_msg=new byte[in.limit()];
in.get(b_msg);
String s_msg=new String(b_msg);
matcher=pattern.matcher(s_msg);
if(matcher.find())
{
return MessageDecoderResult.OK;
}
else
{
int eof = s_msg.indexOf("</AP>");
if(eof >= 0)
{
if( s_msg.substring(eof).length()>20) //</AP>加上通信MAC共21个字符,大于20证明数据包已经收全
{
logger.info(s_msg);
return MessageDecoderResult.NOT_OK; //返回NOT_OK 则handler出会捕捉到ProtocolDecoderException异常
}
}
logger.info(s_msg+"数据包不全,继续接收...");
return MessageDecoderResult.NEED_DATA;
}
}
protected String decodeBody( IoSession session, ByteBuffer in )
{
String result=null;
StringBuffer head=new StringBuffer();
CharsetDecoder decoder = charset.newDecoder();
for(int i=0;i<4;i++) //单独处理数据包的前四个字节是长度信息(底位在前,高位在后),因为它对CharsetDecoder解码造成影响
{
byte b=in.get();
head.append((char)b);
}
try //解码数据包
{
result=in.getString(decoder);
}
catch(UnmappableCharacterException uce)
{
StringBuffer sb=new StringBuffer();
while(in.hasRemaining())
{
byte b=in.get();
sb.append((char)b);
}
ExceptionLoger.ExLog(ErrMsg.ZF_UnmappableCharacterException);
ExceptionLoger.ExLog(sb.toString());
ExceptionLoger.ExLog(uce);
return null;
}
catch(Exception e) {
ExceptionLoger.ExLog(e);
return null;
}
return head.toString()+result.trim();
}
/* protected String decodeBody( IoSession session, ByteBuffer in )
{
StringBuffer sb=new StringBuffer();
while(in.hasRemaining())
{
byte b=in.get();
sb.append((char)b);
}
return sb.toString();
}*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -