2016-08-01 1 views
1

J'ai recherché sur ce problème avant de demander, mais je ne pouvais pas trouver quelque chose de similaire. J'ai développé une solution client/serveur pour envoyer/recevoir des messages HL7. J'utilise socket pour connecter le client au serveur et à partir de cette connexion, je suis en mesure d'envoyer seulement 1 message HL7 en utilisant l'objet OutputSteam. Comment pourrais-je envoyer plusieurs HL7 dans la même connexion socket? J'ai essayé différentes approches mais elles ne fonctionnaient pas correctement.Envoyer plusieurs messages HL7 dans la même connexion Socket

Voici le morceau de mon code du côté client:

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

Du côté du serveur

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

Comment pourrais-je envoyer plus de messages HL7 dans la même connexion socket?

+0

Votre exemple envoie un seul message. Pouvez-vous montrer comment vous appelez votre code avec plus d'un message et quels messages de contrôle ou d'erreur obtenez-vous? – sqlab

+0

START_BLOCK, CARRIAGE_RETURN, END_BLOCK. Pourriez-vous s'il vous plaît me dire les valeurs de ces variables? Merci. – andres83

Répondre

2

Ce que vous voulez vraiment faire est de séparer vos sockets de vos données. Je suggère d'utiliser un TCP Client Server comme celui-ci pour gérer vos prises. Ensuite, vous écrivez simplement un message à votre client. J'ai un service qui fait ça pour moi. Fondamentalement, je emballer toute chaîne de HL7, que vous savez déjà comment faire, puis appelez la méthode Send du serveur TCP.

mine ressemble à cela, mais je pense que celle du lien ressemblera:

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

La partie importante, comme vous pouvez voir que les chiffres TCP Server si oui ou non il y a une disposition socket et en ouvre un si nécessaire. Ensuite, il envoie les données sur la ligne. Je pense que vous aurez beaucoup de difficulté si vous ne séparez pas la transmission/codage à TCP de la messagerie HL7. Si vous voulez attendre un accusé de réception pour MLLP version 2, je tire personnellement le message sortant ID et le message de retour ID dans l'accusé de réception et de les comparer:

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

Et puis je l'écoute pour l'accusé de réception, et d'élever une événement sur les données provenant de:

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

Mais la version courte est de gérer les transmissions et les prises dans leurs propres classes et juste envoyer et attendre les données de leur part.