📄 udserverhandler.java
字号:
package com.frontMachine.server;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoFilter;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.common.IoSessionConfig;
import org.apache.mina.common.WriteFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.SocketSessionConfig;
import com.frontMachine.codec.UDCodecFactory;
import com.frontMachine.setting.ServerSetting;
import com.frontMachine.util.ErrMsg;
import com.frontMachine.util.ExceptionLoger;
import com.frontMachine.util.StrUtil;
/**
* @更新服务事件驱动类 接受终端的更新请求和处理 接收终端的log上送
* @author LRT
* @version 1.0
*/
public class UDServerHandler extends IoHandlerAdapter
{
protected String[] fmsgPack;
protected File[] dlfiles;
protected static Logger loger = Logger.getLogger(UDServerHandler.class);
protected static Logger termloger = Logger.getLogger("TerminalLog");
protected static IoFilter CODEC_FILTER = new ProtocolCodecFilter(new UDCodecFactory());
public void sessionCreated(IoSession session) throws Exception
{
session.getFilterChain().addLast("codec", CODEC_FILTER);
IoSessionConfig cfg = session.getConfig();
if (cfg instanceof SocketSessionConfig)
{
((SocketSessionConfig) cfg).setReceiveBufferSize(ServerSetting.getInstance().getReceiveBufferSize());
((SocketSessionConfig) cfg).setKeepAlive(true);
//((SocketSessionConfig) cfg).setSoLinger(true, 0);
((SocketSessionConfig) cfg).setTcpNoDelay(true);
}
session.setAttribute("fileIndex",new Integer(0));
}
public void messageReceived(IoSession session, Object message) throws Exception
{
if(ServerSetting.getInstance().terminalLog()) //是否记录pos终端上送的log
{
String termLog=StrUtil.getXMLData(message.toString(),"log");
//System.out.println(message.toString());
if(termLog !="")
{
StringBuffer termLogBuf=new StringBuffer();
termLogBuf.append("**********************************************\r\n");
termLogBuf.append("[pos机送出数据]:");
termLogBuf.append(StrUtil.getXMLData(termLog, "frompos"));
termLogBuf.append("\r\n");
termLogBuf.append("[发送到清分数据]:");
termLogBuf.append(StrUtil.getXMLData(termLog, "toserver"));
termLogBuf.append("\r\n");
termLogBuf.append("[清分返回数据]:");
termLogBuf.append(StrUtil.getXMLData(termLog, "fromserver"));
termLogBuf.append("\r\n");
termLogBuf.append("[发送到pos机数据]:");
termLogBuf.append(StrUtil.getXMLData(termLog, "topos"));
termloger.info("["+session.getRemoteAddress()+"]"+termLogBuf.toString());
}
}
if(dlfiles.length==0) //下载目录中没有可下载的文件
{
session.write(ErrMsg.UD_FILEDIR_NODLFILE);
session.close();
return;
}
int fi=((Integer)session.getAttribute("fileIndex")).intValue();
String fn_reqidx=StrUtil.getXMLData(message.toString(),"filename");
String f_reqidx=StrUtil.getXMLData(message.toString(),"file");
if(fn_reqidx != "")
{
if(Integer.parseInt(fn_reqidx)==fi)
{
session.write(fmsgPack[fi]);
}
else
{
session.write("<updateable>false</updateable>");
session.close();
return;
}
}
if(f_reqidx != "")
{
synchronized(Files4PosSys.getInstance())
{
if(Integer.parseInt(f_reqidx)==fi)
{
senddata(session,
dlfiles[fi],
ServerSetting.getInstance().getSendPartSize(),
Files4PosSys.getInstance());
fi++;
session.setAttribute("fileIndex",new Integer(fi));
}
else
{
session.write("<updateable>false</updateable>");
session.close();
}
}
}
}
protected void senddata(IoSession session,File f2snd,int partsize,Files4Download f4dl) //发送文件
{
try
{
f4dl.useDIR();
DataInputStream dis=new DataInputStream(new FileInputStream(f2snd));
byte[] dataArray=new byte[partsize];
int read=dis.read(dataArray);
long start=System.currentTimeMillis();
while(read!=-1 && !session.isClosing())
{
WriteFuture wfuture=session.write(ByteBuffer.wrap(dataArray,0,read));
wfuture.join();
read=dis.read(dataArray);
}
long end=System.currentTimeMillis();
loger.info("客户端["+session.getRemoteAddress()+"]下载文件<"+f2snd.getName()+">,文件大小"+f2snd.length()+"字节,用时"+(end-start)+"毫秒");
}
catch(FileNotFoundException fnfe)
{
ExceptionLoger.ExLog("Exception occured when operning the file:<"+f2snd.getName()+">");
}
catch(IOException ioe)
{
ExceptionLoger.ExLog("Connection Error");
ExceptionLoger.ExLog(ioe);
}
catch(Exception e)
{
ExceptionLoger.ExLog(e);
}
finally
{
f4dl.unuseDIR();
}
}
public void messageSent(IoSession session, Object message) throws Exception
{
if(((Integer)session.getAttribute("fileIndex")).intValue()>=dlfiles.length)
{
session.setAttribute("fileIndex",new Integer(0));
}
}
public void sessionOpened(IoSession session) throws Exception
{
if(Files4PosSys.getInstance().isLocked())//如果下载目录被锁,则此次请求被拒绝
{
session.write(ErrMsg.UD_FILEDIR_LOCKED);
session.close();
return;
}
session.setIdleTime( IdleStatus.BOTH_IDLE, ServerSetting.getInstance().getIdleTime() );
Files4PosSys.getInstance().reflashDIR();
dlfiles=Files4PosSys.getInstance().getDlfiles();
fmsgPack=Files4PosSys.getInstance().fileMsgPack();
}
public void exceptionCaught(IoSession session, Throwable exp) throws Exception
{
System.out.println("In UDServerHandler Caught Exception....");
//ExceptionLoger.ExLog(exp);
exp.printStackTrace();
session.close();
}
public void sessionIdle( IoSession session, IdleStatus status )
{
session.close();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -