package com.ots.project.exam.service.impl; import com.alibaba.fastjson.JSON; import com.ots.project.exam.service.ReportCalculationServices; import com.ots.project.tool.report.reportCalculation.response.ReportAPIResult; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Objects; @Service @Slf4j public class ReportCalculationServicesImpl implements ReportCalculationServices { private Socket socket; private PrintWriter socketOut; private BufferedReader socketIn; @Value("${ATSTai.port}") private int port; @Value("${ATSTai.host}") private String host; @PostConstruct private void init() { try { //首先直接创建socket,端口号1~1023为系统保存,一般设在1023之外 socket = new Socket(host, port); //创建三个流,系统输入流BufferedReader systemIn,socket输入流BufferedReader socketIn,socket输出流PrintWriter socketOut; socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); socketOut = new PrintWriter(socket.getOutputStream()); } catch (Exception ex) { log.error("调用泰国团队组件连接失败:{}",ex.getMessage(),ex); } } @PreDestroy private void destory() { if (Objects.nonNull(socketIn)) { try { socketIn.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } if (Objects.nonNull(socketOut)) { socketOut.close(); } if (Objects.nonNull(socket)) { try { socket.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } } /** * 判断是否断开连接,断开返回true,没有返回false * @param socket * @return */ public Boolean isServerClose(Socket socket){ try{ socket.sendUrgentData(0xFF);//发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信 return false; }catch(Exception se){ return true; } } @Override public ReportAPIResult stageCalculation(Object request) { if (isServerClose(socket)) { destory(); init(); } ReportAPIResult reportAPIResult = new ReportAPIResult(); try { reportAPIResult = getReportAPIResult(request); }catch (Exception ex) { log.error("调用泰国团队组件断开:尝试重连......"); destory(); init(); try { reportAPIResult = getReportAPIResult(request); } catch (IOException e) { e.printStackTrace(); reportAPIResult.setCode("111"); reportAPIResult.setMessage("调用泰国团队组件异常:" + ex.getMessage()); } } return reportAPIResult; } private ReportAPIResult getReportAPIResult(Object request) throws IOException { ReportAPIResult reportAPIResult; socketOut.println(JSON.toJSONString(request)); socketOut.flush();//赶快刷新使Server收到,也可以换成socketOut.println(readline, ture) String inTemp = socketIn.readLine(); reportAPIResult = JSON.parseObject(inTemp, ReportAPIResult.class); return reportAPIResult; } }