2016-08-01 22 views
1

Ich suchte nach diesem Problem vor der Frage, aber ich konnte etwas ähnliches nicht finden. Ich entwickelte eine Client/Server-Lösung zum Senden/Empfangen von HL7-Nachrichten. Ich verwende Socket, um den Client mit dem Server zu verbinden, und von dieser Verbindung kann ich nur 1 HL7-Nachricht mit OutputSteam-Objekt senden. Wie kann ich mehrere HL7 in derselben Socket-Verbindung senden? Ich habe verschiedene Ansätze ausprobiert, aber sie haben nicht richtig funktioniert. HierSenden Sie mehrere HL7-Nachricht in der gleichen Socket-Verbindung

ist das Stück von meinem Code von der Client-Seite:

//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|^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||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)); 

Von der Server-Seite

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); 
       } 
      } 

Wie könnte ich mehr HL7-Nachrichten in der gleichen Socket-Verbindung senden?

+0

Ihr Beispiel sendet nur eine Nachricht. Können Sie zeigen, wie Sie Ihren Code mit mehr als einer Nachricht aufrufen und welche Kontroll- oder Fehlermeldungen Sie erhalten? – sqlab

+0

START_BLOCK, CARRIAGE_RETURN, END_BLOCK. Könnten Sie mir bitte die Werte dieser Variablen mitteilen? Vielen Dank. – andres83

Antwort

2

Was Sie wirklich tun möchten, ist Ihre Sockets von Ihren Daten zu trennen. Ich schlage vor, eine TCP Client Server wie diese zu verwenden, um Ihre Sockets zu verwalten. Dann schreiben Sie einfach eine Nachricht an Ihren Kunden. Ich habe einen Service, der das für mich tut. Grundsätzlich verpacke ich eine beliebige Zeichenfolge von HL7, die aussieht wie Sie bereits wissen, und rufen Sie dann die Send-Methode des TCP-Servers.

-Mine sieht so aus, aber ich denke, die man in der Verbindung ähnlich aussehen wird:

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) 
     {     
     } 
    } 

Der wichtige Teil, wie Sie sehen können, ist, dass die TCP-Server Figuren aus, ob es eine verfügbare Steckdose und öffnet bei Bedarf eine. Dann sendet es die Daten auf der ganzen Linie. Ich denke, dass Sie eine Menge Schwierigkeiten haben werden, wenn Sie die Übertragung/Codierung von der HL7-Nachricht nicht zu TCP trennen. Wenn Sie für eine ACK für MLLP Release warten möchten 2, ziehe ich persönlich die Outbound-Message-ID und die zurückgehende Nachrichten-ID in der ACK und vergleichen sie:

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

Und dann höre ich für die ACK, und heben Sie ein Veranstaltung auf den Daten in der kommenden:

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

Aber die kurze Version ist, die Übertragungen und Steckdosen in ihren eigenen Klassen verwalten und senden nur und warten Daten von ihnen.