package com.nms.server.thread.socket; import java.util.List; import java.util.concurrent.Callable; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.nms.server.common.Constants; import com.nms.server.util.ExceptionPrintUtils; import com.nms.server.util.socket.SocketUtils; import com.nms.server.util.socket.limiter.InputStreamLimiter; import com.nms.server.util.socket.limiter.OutputStreamLimiter; import com.socket.utils.FileComment; /** * 安全通讯的客户端 */ public class NMSWebBPDownload extends SocketUtils implements Callable{ private static Logger logger = Logger.getLogger(NMSWebBPDownload.class); private String cmd = "byte:bpDownloadFile"; private String downDir=null; private final List fileList; // public static final String TYPE_MISSION = "1"; public static final String TYPE_SNMP_CLASS = "2"; public static final String TYPE_SNMP_MIB = "3"; /** * * @param fileList 需要下载的文件的 信息结构 String[]{fileName,start,end,MD5} * @param downDir 保存路径 文件的保存路径 * @param downType 下载类型 统一下载接口的子分类 用于确认 服务端配置文件、任务文件等非同一目录下保存的文件 * @throws Exception */ public NMSWebBPDownload(String IP,Integer PORT,List fileList,String downDir,String downType) throws Exception{ super(IP,PORT); this.fileList = fileList; this.downDir = downDir; cmd +=":"+downType; } /** * 通讯线程执行方法 默认格式 * @return * @throws Exception */ public Object call(){ // Thread.currentThread().setName("任务文件下载线程"); Thread.currentThread().setName("Task File Download Thread"); Object obj = null; //返回对象 //- 校验 是否创建新通讯连接 if(socket==null && (StringUtils.isNotEmpty(ip) && port != null)){ try { //-- create SocketFactory SSLSocketFactory ssf = sSLContext.getSocketFactory(); //-- create socket socket=(SSLSocket)ssf.createSocket(ip,port); logger.debug("create socket success."); //2014-1-23 hyx 如果建立socket成功,但是startHandshake握手失败,且未设置超时时间时,则会一直阻塞 socket.setSoTimeout(Constants.SSL_SO_TIMEOUT*1000); //-- handshake 握手 ((SSLSocket) socket).startHandshake(); logger.debug("handshake success."); } catch (Exception e) { logger.warn("Target communication:>"+ip+":"+port+" create failure",e); close(); return -2; } } try { //-- 获取通讯IO流 outl = new OutputStreamLimiter(socket.getOutputStream()); inl = new InputStreamLimiter(socket.getInputStream()); //增加通讯超时设置 socket.setSoTimeout(Constants.SSL_SO_TIMEOUT*1000); // logger.info("通信超时时间:"+Constants.SSL_SO_TIMEOUT*1000); //-- 自定义通讯操作 obj = toDo(); }catch (Exception e) { logger.error(ExceptionPrintUtils.printExceptionStack(e)); obj = -1; } finally { close(); logger.info("--- 通信关闭 ---"); } return obj; } /* * 返回值描述 * 0 下载成功 * 1 下载失败 * -1 下载失败 可再次尝试 * -2 下载失败 且无需再次尝试 * -3 待下载文件不存在 */ public Object toDo() throws Exception { // Thread.currentThread().setName("任务文件下载线程"); Thread.currentThread().setName("Task file download thread"); try { //存在未下载的文件 开始通讯 if(fileList.size()>0){ //- 通讯命令 sendMessage(cmd); String str = receiveMessage(); //- 发送下载文件名称 sendObject(fileList); //- 接收文件长度 return bpReceiveFileByBathMd5(downDir); } return 0; } catch (Exception e) { logger.error(ExceptionPrintUtils.printExceptionStack(e)); return -1; } } }