Подтверждение сообщения сокета 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, я думаю, это работает