2

我正在尝试在 python 中创建 HL7 侦听器。我能够通过套接字接收消息,但无法发送有效的确认

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')

蟒蛇代码:

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)
4

2 回答 2

1

我认为您的完整确认没有被发送。您正在使用clientSocket.send(ack).

改为使用clientSocket.sendall(ack)

有关更多详细信息,请参阅@kwarunek 的答案。

socket.send是一种低级方法,基本上只是 C/系统调用方法send(3) / send(2)。它可以发送的字节数少于您请求的字节数,但会返回发送的字节数。

socket.sendall是一种高级 Python 方法,用于发送您传递的整个缓冲区或引发异常。它通过调用socket.send直到所有内容都已发送或发生错误来做到这一点。

如果您正在使用带有阻塞套接字的 TCP,并且不想被内部结构所困扰(大多数简单的网络应用程序就是这种情况),请使用sendall.

于 2019-08-23T12:01:02.487 回答
-1

尝试在我认为可行的 \n 语法中在 MSA|AA 前面添加 enter

于 2021-12-27T00:15:32.753 回答