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<String, List> 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<String> 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<String> 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<String> dataExplain(String data) {
|
String[] segments = data.split("\r");
|
ArrayList<String> arrayList = new ArrayList();
|
|
// Process each segment
|
for (String segment : segments) {
|
// 根据 '|'进行截取
|
String[] fields = segment.split("\\|");
|
|
// 遍历数组
|
for (String field : fields) {
|
arrayList.add(field);
|
}
|
}
|
return arrayList;
|
}
|
}
|