⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udserverhandler.java

📁 用mina框架编写的转发代理服务程序,含自动更新功能
💻 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 + -