2016-08-01 2 views
1

Я искал эту проблему, прежде чем спрашивать, но я не мог найти что-то подобное. Я разработал клиент/серверное решение для отправки/получения сообщения HL7. Я использую socket для подключения клиента к серверу, и из этого соединения я могу отправить только 1 сообщение HL7, используя объект OutputSteam. Как я могу отправить несколько 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|^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)); 

Со стороны сервера

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 сообщения в том же сокет-соединение?

+0

Ваш пример отправляет только одно сообщение. Можете ли вы показать, как вы называете свой код более чем одним сообщением и какие сообщения управления или ошибок вы получаете? – sqlab

+0

START_BLOCK, CARRIAGE_RETURN, END_BLOCK. Не могли бы вы рассказать мне значения этих переменных? Благодарю. – andres83

ответ

2

Что вы действительно хотите сделать, это отделить ваши сокеты от ваших данных. Я предлагаю использовать TCP Client Server, как этот, чтобы управлять вашими сокетами. Тогда вы просто напишите сообщение своему клиенту. У меня есть служба, которая делает это для меня. В принципе, я упаковываю любую строку HL7, которая, как вам кажется, уже знает, как это сделать, а затем вызывает метод отправки TCP-сервера.

Mine выглядит так, но я думаю, что один в ссылке будет выглядеть:

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. Если вы хотите ждать ACK для MLLP выпуска 2, я лично вытаскивать идентификатор исходящего сообщения и возвращающегося идентификатор сообщения в АСК и сравнить их:

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

А потом я слушаю для ACK, и поднять событие на данных, поступающих в систему:

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

Но короткая версия управления коробки передач и розетки в своих классах и просто отправлять и ждать от них данные.

Смежные вопросы