gpt4 book ai didi

java - 在同一个Socket连接中发送多个HL7消息

转载 作者:行者123 更新时间:2023-11-30 02:50:50 38 4
gpt4 key购买 nike

我在提问之前搜索过这个问题,但找不到类似的东西。我开发了一个客户端/服务器解决方案来发送/接收 HL7 消息。我正在使用套接字将客户端连接到服务器,并且通过该连接我可以使用 OutputSteam 对象仅发送 1 条 HL7 消息。如何在同一个套接字连接中发送多个 HL7?我尝试了不同的方法,但它们都不能正常工作。

这是我的客户端代码片段:

//Create socket that is connected to server on specified port
System.out.println("Connecting to Server....");
Socket socket = new Socket(ipServer, serverPort);
System.out.println("Connected to Server");

StringBuffer HL7Message1 = new StringBuffer();

//Message 1
HL7Message1
.append(START_BLOCK)
.append("MSH|^~\\&|NES|NINTENDO|TESTSYSTEM|TESTFACILITY|20010101000000||ADT^A04|Q000000000000000001|P|2.3")
.append(CARRIAGE_RETURN)
.append("EVN|A04|20010101000000|||^KOOPA^BOWSER^^^^^^^CURRENT")
.append(CARRIAGE_RETURN)
.append("PID|1||123456789|0123456789^AA^^JP|BROS^MARIO^HELLO^WORLD^ONE^||19850101000000|M|||123 FAKE STREET^MARIO \\T\\ LUIGI BROS PLACE^TOADSTOOL KINGDOM^NES^A1B2C3^JP^HOME^^1234|1234|(555)555-0123^HOME^JP:1234567|||S|MSH|12345678|||||||0|||||N")
.append(CARRIAGE_RETURN)
.append("NK1|1|PEACH^PRINCESS^^^^|SO|ANOTHER CASTLE^^TOADSTOOL KINGDOM^NES^^JP|(123)555-1234|(123)555-2345|NOK|||||||||||||")
.append(CARRIAGE_RETURN)
.append("NK1|2|TOADSTOOL^PRINCESS^^^^|SO|YET ANOTHER CASTLE^^TOADSTOOL KINGDOM^NES^^JP|(123)555-3456|(123)555-4567|EMC|||||||||||||")
.append(CARRIAGE_RETURN)
.append("PV1|1|O|ABCD^EFGH^|||^^|123456^DINO^YOSHI^^^^^^MSRM^CURRENT^^^NEIGHBOURHOOD DR NBR^|^DOG^DUCKHUNT^^^^^^^CURRENT||CRD|||||||123456^DINO^YOSHI^^^^^^MSRM^CURRENT^^^NEIGHBOURHOOD DR NBR^|AO|0123456789|1|||||||||||||||||||MSH||A|||20010101000000"
)
.append(CARRIAGE_RETURN)
.append("IN1|1|PAR^PARENT||||LUIGI")
.append(CARRIAGE_RETURN)
.append("IN1|2|FRI^FRIEND||||PRINCESS")
.append(CARRIAGE_RETURN)
.append(END_BLOCK)
.append(CARRIAGE_RETURN);

InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();

//Send the MLLP-wrapped HL7 message to the server
out.write(HL7Message1.toString().getBytes());

byte[] byteBuffer = new byte[200];
in.read(byteBuffer);
System.out.println("Received from Server: " + new String(byteBuffer));

从服务器端

public String getMessage(InputStream anInputStream) throws IOException  {

boolean end_of_message = false;
StringBuffer parsedMessage = new StringBuffer();

int characterReceived = 0;

try {
characterReceived = anInputStream.read();
} catch (SocketException e) {
System.out
.println("Unable to read from socket stream. "
+ "Connection may have been closed: " + e.getMessage());
return null;
}

if (characterReceived == END_OF_TRANSMISSION) {
return null;
}

if (characterReceived != START_OF_BLOCK) {
throw new RuntimeException(
"Start of block character has not been received");
}

while (!end_of_message) {
characterReceived = anInputStream.read();

if (characterReceived == END_OF_TRANSMISSION) {
throw new RuntimeException(
"Message terminated without end of message character");
}

if (characterReceived == END_OF_BLOCK) {
characterReceived = anInputStream.read();

if (characterReceived != CARRIAGE_RETURN) {
throw new RuntimeException(
"End of message character must be followed by a carriage return character");
}
end_of_message = true;
} else {
parsedMessage.append((char) characterReceived);
}
}

如何在同一套接字连接中发送更多 HL7 消息?

最佳答案

您真正想做的是将套接字与数据分开。我建议使用 TCP Client Server像这样一个来管理你的套接字。然后您只需向您的客户写一条消息即可。我有一项服务可以为我做这件事。基本上,我打包了 HL7 的任何字符串,看起来你已经知道如何做了,然后调用 TCP 服务器的 Send 方法。

我的看起来像这样,但我认为链接中的看起来类似:

public int Send(string data)
{
TcpClient sender = new TcpClient();
IPEndPoint localEP = new IPEndPoint(IPAddress.Any, Port);
try
{
TcpServerConnection cn;

if (connections.Count == 0)
{
//if there are no connections then we end up here.
ConnectSocket(sender, localEP);
}

cn = connections[0];

if (cn.Socket.Connected && cn.verifyConnected())
{
cn.sendData(data);
return connections.Count;
}
cn.Socket.Close();

ConnectSocket(sender, localEP);
if (cn.Socket.Connected && cn.verifyConnected())
{
cn.sendData(data);
return connections.Count;
}
cn.Socket.Close();
return -1;
}
catch (Exception e)
{
}
}

正如您所看到的,重要的部分是 TCP 服务器确定是否有可用的套接字,并在必要时打开一个。然后它沿着线路发送数据。我认为如果您不将 TCP 的传输/编码与 HL7 消息传递分开,您将会遇到很多困难。如果你想等待MLLP版本2的ACK,我亲自拉出ACK中的出站消息ID和返回消息ID并比较它们:

if (lastOutMessageID == lastOutAckID || lastOutMessageID == "")
{
lastOutMessageID = SendNextHL7Message;
}

然后我监听 ACK,并对传入的数据引发一个事件:

void _contractManager_OnAckReceived(string msgID, string ackStatus)
{
lastOutAckID = msgID;
lastOutStatus = ackStatus;
lastAckTime = DateTime.Now;
outRetries = 0;
DoNextHL7();
}

但简短的版本是在自己的类中管理传输和套接字,然后仅发送和等待来自它们的数据。

关于java - 在同一个Socket连接中发送多个HL7消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38709348/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com