package com.ruoyi.web.controller.socket; import ca.uhn.hl7v2.DefaultHapiContext; import ca.uhn.hl7v2.HapiContext; import ca.uhn.hl7v2.model.v24.message.ACK; import ca.uhn.hl7v2.parser.Parser; import com.ruoyi.common.utils.StringUtils; import com.smartor.service.impl.RemoteDataSaveServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RestController; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @RestController @Slf4j public class SocketCommunication { public String socketCommunication() { try { // 创建 ServerSocket 实例,监听 8080 端口 ServerSocket serverSocket = new ServerSocket(8999); //固定线程池来接收处理 Executor executor = Executors.newFixedThreadPool(3); // 等待客户端连接 while (true) { Socket socket = serverSocket.accept(); // new Thread(new MyRuns(socket)).start(); executor.execute(new MyRuns(socket)); } } catch (IOException e) { e.printStackTrace(); return "发生异常:" + e.getMessage(); } } } class MyRuns implements Runnable { Socket socket; BufferedReader reader; PrintWriter writer = null; // BufferedWriter writer; public MyRuns(Socket socket) { super(); this.socket = socket; } public void run() { Map map = new HashMap<>(); try { reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));//读取客户端消息 // writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);//向客户端写消息 //获取第一行数据 String oneLine = reader.readLine(); // 创建HapiContext实例 HapiContext context = new DefaultHapiContext(); // 创建Parser实例 Parser parser = context.getPipeParser(); // 解析HL7消息 List list = dataExplain(oneLine); map.put(list.get(0).trim(), list); //获取返回数据 String messageControlID = list.get(9); String timeOfAnEvent = list.get(6); // String senderApp = list.get(2); // String senderFac = list.get(3); String dataType = list.get(8); if (StringUtils.isNotEmpty(dataType)) { int endIndex = dataType.lastIndexOf("^"); dataType = dataType.substring(0, endIndex); int endIndex2 = dataType.lastIndexOf("^"); dataType = dataType.substring(endIndex2); } //设置时间戳 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYYMMddHHmmss"); String timestamp = simpleDateFormat.format(new Date()); //返回响应(响应数据进行组装) ACK ack = new ACK(); ack.initQuickstart("ACK", "2.4", "P"); // 设置MSH段的字段 ack.getMSH().getSendingApplication().getNamespaceID().setValue("SF"); // ack.getMSH().getSendingFacility().getNamespaceID().setValue(senderFac); ack.getMSH().getSendingFacility().getNamespaceID().setValue("SF"); // ack.getMSH().getReceivingApplication().getNamespaceID().setValue(senderApp); ack.getMSH().getReceivingApplication().getNamespaceID().setValue("QN"); // ack.getMSH().getReceivingFacility().getNamespaceID().setValue(senderFac); ack.getMSH().getReceivingFacility().getNamespaceID().setValue("QN"); ack.getMSH().getDateTimeOfMessage().getTimeOfAnEvent().setValue(timeOfAnEvent); ack.getMSH().getMessageType().getMessageType().setValue("ACK"); ack.getMSH().getMessageType().getTriggerEvent().setValue("ACK"); ack.getMSH().getMessageControlID().setValue(timestamp); ack.getMSH().getProcessingID().getProcessingID().setValue("P"); ack.getMSH().getVersionID().getVersionID().setValue("2.4"); // 设置MSA段的字段 ack.getMSA().getAcknowledgementCode().setValue("AA"); ack.getMSA().getMessageControlID().setValue(messageControlID); ack.getMSA().getTextMessage().setValue(""); // 将ACK消息转换为字符串 String responseString = parser.encode(ack); //获取两个ACK的位置 int ack1 = responseString.indexOf("ACK", 0); int i1 = responseString.lastIndexOf("^ACK"); //给两个ACK之间加上数据类型 responseString = responseString.substring(0, ack1 + 3) + dataType + responseString.substring(i1); //加上开始符和结束符 char startSymbol = 0x0B; // 开始符(0x0B) char endSymbol = 0x1C; // 结束符(0x1C) String backData = String.valueOf(startSymbol) + responseString + String.valueOf(endSymbol); writer.println(backData); //处理传来的数据 String lineString = null; String dataInfo = ""; dataInfo += oneLine + "\r\n"; while ((lineString = reader.readLine()) != null) { // 对获取的数据,进行拼接 List list2 = dataExplain(lineString); if (!CollectionUtils.isEmpty(list2)) { //key有可能重复,导致数据被覆盖,所以,往数据库保存数据的时候,用stringBuilder里的数据 map.put(list2.get(0).trim(), list2); } dataInfo += lineString + "\r\n"; } //去掉最后一个换行 int i = dataInfo.lastIndexOf("\r\n"); dataInfo = dataInfo.substring(0, i); //打印一下收到数据时间 SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss"); String date = simpleDateFormat1.format(new Date()); System.out.println(date + " 收到数据时间,内容 : " + dataInfo); RemoteDataSaveServiceImpl remoteDataSaveService = new RemoteDataSaveServiceImpl(); remoteDataSaveService.dealData(map, dataInfo); } catch (Exception e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } if (writer != null) { writer.close(); } if (socket != null) { socket.close(); } } catch (Exception e2) { e2.printStackTrace(); } } } private List dataExplain(String data) { String[] segments = data.split("\r"); ArrayList arrayList = new ArrayList(); // Process each segment for (String segment : segments) { // 根据 '|'进行截取 String[] fields = segment.split("\\|"); // 遍历数组 for (String field : fields) { arrayList.add(field); } } return arrayList; } }