diff options
| author | chenjinsong <[email protected]> | 2018-09-27 16:11:54 +0800 |
|---|---|---|
| committer | chenjinsong <[email protected]> | 2018-09-27 16:11:54 +0800 |
| commit | 56d71f261a8bd6031e47e2bf80867049a2aa13da (patch) | |
| tree | f09257b2143782a333a9eda3395137837d9bdad1 /src/com/nis/nmsclient/thread/socket/SSLClient.java | |
initial commit
Diffstat (limited to 'src/com/nis/nmsclient/thread/socket/SSLClient.java')
| -rw-r--r-- | src/com/nis/nmsclient/thread/socket/SSLClient.java | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/src/com/nis/nmsclient/thread/socket/SSLClient.java b/src/com/nis/nmsclient/thread/socket/SSLClient.java new file mode 100644 index 0000000..db8dd6d --- /dev/null +++ b/src/com/nis/nmsclient/thread/socket/SSLClient.java @@ -0,0 +1,288 @@ +package com.nis.nmsclient.thread.socket; + +import java.io.File; +import java.util.List; +import java.util.concurrent.Callable; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; + +import net.sf.json.JSONArray; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; + +import com.nis.nmsclient.common.Contants; +import com.nis.nmsclient.model.ReturnFilePO; +import com.nis.nmsclient.thread.task.TaskReqHandle; +import com.nis.nmsclient.thread.task.TaskResultOper; +import com.nis.nmsclient.util.FileUtil; +import com.nis.nmsclient.util.Utils; + + +/** + * 安全通讯的客户端 + **/ + +public class SSLClient extends CommonSocket implements Callable<Object>{ + Logger logger = Logger.getLogger(SSLClient.class); + private String name; + private String reqCmd; + private Object obj; + private String serverHost; + + public SSLClient(String name, String reqCmd, Object obj) { + this.name = name; + this.reqCmd = reqCmd; + this.obj = obj; + this.serverHost = Contants.SOCKET_SERVER_HOST; + } + + public SSLClient(String name, String reqCmd, Object obj, String serverHost) { + this.name = name; + this.reqCmd = reqCmd; + this.obj = obj; + this.serverHost = serverHost; + } + + /** + * 初始化客户端Socket + **/ + public void init() throws Exception { + SSLContext ctx = SSLCertOper.getSSLContext(); + SSLSocketFactory ssf = ctx.getSocketFactory(); + + socket = (SSLSocket) ssf.createSocket(serverHost, + Contants.SOCKET_SERVER_PORT); + logger.debug("create socket success."); + + //2014-1-23 hyx 如果建立socket成功,但是startHandshake握手失败,且未设置超时时间时,则会一直阻塞 + socket.setSoTimeout(1000 * 60 * Contants.SOCKET_TIMEOUT_MINUTES); + + ((SSLSocket) socket).startHandshake(); + logger.debug("handshake success."); + } + + @Override + public Object call() throws Exception { +// Thread.currentThread().setName(name + ">>通信 " + serverHost); + Thread.currentThread().setName(name + ">>Communication " + serverHost); + Object object = null; + try { + init(); + if(socket!=null){ + out = socket.getOutputStream(); + in = socket.getInputStream(); + //设置超时时间 + socket.setSoTimeout(1000 * 60 * Contants.SOCKET_TIMEOUT_MINUTES); + object = toDo(); + } + }catch (Exception e) { +// object = Contants.COMMON_MSG_FAIL + Contants.COMMON_MSG_SEPRATOR + "异常"; + object = Contants.COMMON_MSG_FAIL + Contants.COMMON_MSG_SEPRATOR + "anomaly"; + logger.error("Communication anomaly:" + Utils.printExceptionStack(e)); + } finally { + logger.debug("关闭通信"); + close(); + } + + return object; + } + + protected Object toDo() throws Exception { + logger.debug("发送通信请求:" + reqCmd); + //-- 无效操作处理 + if(StringUtils.isEmpty(reqCmd)){ + return null; + } + boolean flag = false; + String msg = null; + String result = null; + //-- 命令判断 + // 与Server通信 + if(reqCmd.equals(REQ_HAND_SHAKE)){ + flag = this.sendMessageByChar(reqCmd); + logger.debug("握手状态:" + (result = this.receiveMessageByChar())); + } + // 通知Server准备升级 + if(reqCmd.equals(REQ_SERVER_UPGRADE)){ + flag = this.sendMessageByChar(reqCmd); + result = this.receiveMessageByChar(); + } + // 获取本机标志UUID + if(reqCmd.equals(REQ_LOCAL_UUID)){ + flag = this.sendMessageByChar(reqCmd); + msg = this.receiveMessageByChar(); + flag = this.sendMessageByChar(CommonSocket.SUCCESS); + logger.info("本机标志UUID:" + msg); + } + //注释 by jinsj 2012-0531 修改为DC主动获取NC时间 + // 获取服务器系统时间 + if(reqCmd.equals(REQ_SERVER_SYSTEMDATE)){ + flag = this.sendMessageByChar(reqCmd); + msg = this.receiveMessageByChar(); + logger.debug("服务器系统时间:" + msg); + flag = this.sendMessageByChar(CommonSocket.SUCCESS); + } + // 发送本机的变更信息(操作系统类型和IP) + if(reqCmd.equals(REQ_LOCAL_CHANGE)){ + // 发送请求 + flag = this.sendMessageByChar(reqCmd); + result = this.receiveMessageByChar(); + // 发送信息: UUID$@$操作系统类型$@$LocalIP + flag = this.sendMessageByChar((String)obj); + // 接收变更结果: 0/1 $@$ 信息 + msg = this.receiveMessageByChar(); + flag = this.sendMessageByChar(CommonSocket.SUCCESS); + return msg; + } + // 初始化配置 + if(reqCmd.equals(REQ_INIT_CONFIG)){ + flag = this.sendMessageByChar(reqCmd); + msg = this.receiveMessageByChar();//接收配置信息 + flag = this.sendMessageByChar(CommonSocket.SUCCESS); + } + // 初始化任务 + if(reqCmd.equals(REQ_INIT_TASK)){ + // 发送请求 + flag = this.sendMessageByChar(reqCmd); + result = this.receiveMessageByChar(); + // 发送本机唯一标识 + flag = this.sendMessageByChar(Contants.AGENT_HOST_UUID + ""); + msg = this.receiveMessageByChar(); + flag = this.sendMessageByChar(CommonSocket.SUCCESS); + if (msg != null && !"".equals(msg)) { + JSONArray jsonArr = JSONArray.fromObject(msg); + //这里处理的任务,原则上不应含有”1 文件推送“类型的任务 + for (int i = 0; i < jsonArr.size(); i++) { + new TaskReqHandle().taskHandle(jsonArr.get(i).toString()); + } + } + logger.debug("初始化任务完成--" + msg); + return null; + } + // 发送主动告警信息 + if(reqCmd.equals(REQ_ALARM)){ + if(obj!=null){ + // 主动告警请求 + flag = this.sendMessageByChar(reqCmd); + result = this.receiveMessageByChar(); + // 发送主动告警信息内容 + flag = this.sendMessageByChar((String)obj); + logger.debug("主动告警信息:" + (String)obj); + result = this.receiveMessageByChar(); + }else{ + logger.debug("主动告警信息为空"); + } + } + // 发送任务结果 + if(reqCmd.equals(REQ_TASK_RESULT)){ + if(obj!=null){ + //发送任务结果请求 + flag = this.sendMessageByChar(reqCmd); + result = this.receiveMessageByChar(); + //发送任务结果内容 + flag = this.sendMessageByChar((String)obj); + result = this.receiveMessageByChar(); + }else{ + logger.warn("Task result information is empty"); + } + } + // 批量上传监测数据【数据收集方式改为DC主动后,此通信废弃】 + if(reqCmd.equals(REQ_UPLOAD_DATAS)){ + if(obj!=null && obj instanceof Object[]) { + Object[] objArr = (Object[])obj; + if (objArr != null && objArr.length > 1 && objArr[0] != null + && objArr[1] != null && objArr[1] instanceof List) { + //发送上传数据请求 + flag = this.sendMessageByChar(reqCmd); + result = this.receiveMessageByChar(); + //上传数据 + this.sendFileByBath((String) objArr[0], (List<File>) objArr[1]); + result = this.receiveMessageByChar(); + }else{ + logger.warn("Uploading the contents of the monitored data object is incorrect"); + } + }else{ + logger.warn("Uploading monitoring data objects is empty"); + } + } + // 任务执行的回传文件:单个文件发送,断点续传【数据收集方式改为DC主动后,此类废弃】 + if(reqCmd.equals(REQ_TASK_RETURNFILE)){ + if(obj!=null && obj instanceof ReturnFilePO){ + ReturnFilePO rfPo = (ReturnFilePO)obj; + //发送回传文件请求 + flag = this.sendMessageByChar(reqCmd); + result = this.receiveMessageByChar(); + //发送回传文件任务信息 + this.sendMessageByChar(TaskResultOper.getTaskResultMsg(rfPo + .getTaskId(), rfPo.getTaskType(), null, null, null, rfPo + .getStartTime(), rfPo.getEndTime(), rfPo.getIsLoop())); + result = this.receiveMessageByChar(); + //发送回传文件文件名称 + this.sendMessageByChar(rfPo.getReturnFileName()); + result = this.receiveMessageByChar(); + //发送回传文件 + flag = this.bpSendFile(Contants.localTaskReturnPath + File.separator + rfPo.getReturnFileName()); + result = this.receiveMessageByChar(); + }else{ + logger.warn("The return file object is empty"); + } + } + + // 发送压缩文件,断点续传 + if(reqCmd.equals(REQ_BP_UPLOAD_FIFE)){ + if(obj!=null && obj instanceof String[]) { + String[] strArr = (String[])obj; + if (strArr != null && strArr.length > 1){ + //打包上传文件请求 + flag = this.sendMessageByChar(reqCmd + ":" + strArr[0]); + result = this.receiveMessageByChar(); + //发送打包文件名 + File file = new File(strArr[1]); + flag = this.sendMessageByChar(file.getName()); + result = this.receiveMessageByChar(); + //上传打包文件 + flag = this.bpSendFile(strArr[1]); + result = this.receiveMessageByChar(); + //上传成功后删除或移动文件 + if(flag && SUCCESS.equalsIgnoreCase(result) && file.exists()){ + String dataType = strArr[0]; + if(BP_TYPE_DETECT_DATA.equalsIgnoreCase(dataType)){ + FileUtil.moveFile(file, Contants.localDataDonePath, true); + }else if(BP_TYPE_TASK_RESULT.equalsIgnoreCase(dataType)){ + FileUtil.moveFile(file, Contants.localTaskDonePath, true); + }else if(BP_TYPE_TASK_RETURN.equalsIgnoreCase(dataType)){ + FileUtil.moveFile(file, Contants.localTaskDonePath, true); + } + } + } + } + } + // 向DC发送NC端异常信息 + if(reqCmd.equals(REQ_ERROR_INFO)){ + if(obj!=null){ + flag = this.sendMessageByChar(reqCmd); + result = this.receiveMessageByChar(); + //发送异常内容 + flag = this.sendMessageByChar((String)obj); + result = this.receiveMessageByChar(); + }else{ + logger.warn("Abnormal information is empty"); + } + } + + if (flag && (SUCCESS.equalsIgnoreCase(result) || msg!=null)) { + msg = Contants.COMMON_MSG_SUCCESS + Contants.COMMON_MSG_SEPRATOR + (msg!=null ? msg : "成功"); + } else { +// msg = Contants.COMMON_MSG_FAIL + Contants.COMMON_MSG_SEPRATOR + "失败"; + msg = Contants.COMMON_MSG_FAIL + Contants.COMMON_MSG_SEPRATOR + "failed"; + } + logger.debug("SSLClient toDo()---" + msg); + + logger.debug("发送通信请求结束:" + reqCmd); + // -- 命令判断 + return msg; + } +}
\ No newline at end of file |
