Как отправить несколько сообщений через одно и то же сокетное соединение?

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

Вот мой клиентский код:

def send_over_socket(hl7_msg_array):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((config.HOST, config.PORT))

    for single_hl7_msg in hl7_msg_array:
        sock.send(single_hl7_msg.to_mllp().encode('UTF-8'))
        received = sock.recv(1024*1024)
        print("Sent: ", received)

    sock.shutdown()
    sock.close()

Во время отладки кода я вижу, что исключение возникает, когда я вызываю sock.recv(1024*1024) для второго сообщения.

Вот ошибка:

ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine

Серверный код:

def run_mllp_server():

    class PDQHandler(AbstractHandler):
        def reply(self):
            msg = hl7.parse(self.incoming_message)
            msg_pid = msg[1][3]
            msg_key = msg[2][3][0][1]
            msg_value = msg[2][5]

            lock = RLock()
            lock.acquire()
            results_collection[str(msg_pid)][str(msg_key)] = str(msg_value)
            lock.release()
            print("Received: ", repr(self.incoming_message))
            return parse_message(self.incoming_message).to_mllp()

    # error handler
    class ErrorHandler(AbstractErrorHandler):
        def reply(self):
            if isinstance(self.exc, UnsupportedMessageType):
                print("Error handler success 1")
            else:
                print("Error handler else case")

    handlers = {
        'ORU^R01^ORU_R01': (PDQHandler,),
        'ERR': (ErrorHandler,)
    }

    server = MLLPServer(config.SOCKET_HOST, config.SOCKET_PORT, handlers)
    print("Running Socket on port ", config.SOCKET_PORT)
    server.serve_forever()

Здесь я использую протокол MLLP, который имеет TCP-соединение за кулисами.

Не могли бы вы мне помочь, пожалуйста, разобраться в том, что происходит? Это проблема ACK?

1 ответ

Я совсем не знаю питона, но...

Я не думаю, что ваша проблема заключается в нескольких сообщениях. Глядя на исключение, я думаю, ваше первое сообщение отправляется правильно. Затем ваш клиентский код ожидает получения ACK; но сервер никогда его не отправляет. Вместо этого он закрывает соединение.

Также убедитесь, что sendall следует использовать вместо send.

После устранения указанной выше проблемы для отправки нескольких сообщений через одно соединение необходимо следовать протоколу MLLP (также называемому LLP), чтобы сервер мог различать сообщение.

Description                 HEX     ASCII   Symbol
Message starting character  0B      11      <VT>
Message ending characters   1C,0D   28,13   <FS>,<CR>

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

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

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