Подтверждение сообщения сокета Python HL7 Listener

Я пытаюсь создать HL7 слушатель в Python. Я могу получать сообщения через сокет, но не могу отправить действительное подтверждение

ack=u"\x0b MSH|^~\\&|HL7Listener|HL7Listener|SOMEAPP|SOMEAPP|20198151353||ACK^A08||T|2.3\x1c\x0d MSA|AA|153681279959711 \x1c\x0d"
ack = "MSH|^~\&|HL7Listener|HL7Listener|SOMEAPP|SOMEAPP|20198151353||ACK^A08||T|2.3 \r MSA|AA|678888295637322 \r"
ack= bytes(ack,'utf-8')

Код Python:

def listner_hl7():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.bind((socket.gethostname(), 4444))
    except Exception as e:
        print(str(e))
    s.listen(5)
    while True:
        clientSocket, addr = s.accept()
        message = clientSocket.recv(2048)
        id = (str(message.splitlines()[0]).split('|')[9])

        print('received {} bytes from {}'.format(
            len(message), addr))

        print('sending acknowledgement: ')
        ack = b"\x0b MSH|^~\\&|HL7Listener|HL7Listener|SOMEAPP|SOMEAPP|20198151353||ACK^A08||T|2.3\x1c\x0d MSA|AA|" + bytes(
            id, 'utf-8') + b" \x1c\x0d"

        clientSocket.send(ack)

2 ответа

Я думаю, что ваше полное подтверждение не отправляется. Ты используешь clientSocket.send(ack),

использование clientSocket.sendall(ack) вместо.

Пожалуйста, обратитесь к этому ответу от @kwarunek для более подробной информации.

socket.send - это низкоуровневый метод, в основном это просто метод C/syscall send (3) / send (2). Он может отправить меньше байтов, чем вы запрашивали, но возвращает количество отправленных байтов.

socket.sendall - это высокоуровневый метод Python-only, который отправляет весь передаваемый вами буфер или выдает исключение. Это делает это путем вызова socket.send пока все не будет отправлено или пока не произойдет ошибка.

Если вы используете TCP с блокирующими сокетами и не хотите, чтобы его беспокоили внутренние устройства (это относится к большинству простых сетевых приложений), используйте sendall,

попробуйте добавить ввод перед MSA|AA в синтаксисе \n, я думаю, это работает

Другие вопросы по тегам