【问题标题】:How to send multiple messages over same socket connection?如何通过同一个套接字连接发送多条消息?
【发布时间】:2020-03-07 07:31:52
【问题描述】:

我正在尝试通过同一个套接字连接发送一组消息,但出现错误。

这是我的客户端代码:

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的问题吗?

【问题讨论】:

    标签: python sockets hl7 mllp


    【解决方案1】:

    我根本不懂python,但是...

    我不认为多条消息是您的问题。查看异常,我猜您的第一条消息已正确发送。然后,您的客户端代码等待收到 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 服务器)发送消息时,它会在您的传入数据中查找开始和结束块。在此基础上,它区分每条消息。

    更多详情请参考this答案。

    【讨论】:

    • 好像是服务器收到第一条消息后就关闭了连接,搞了半天也解决不了这个问题。如果在客户端我将这两行代码放在 for 循环中,一切正常:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect((config.HOST, config.PORT))
    • 但我不想打开 array.size() 套接字,你有什么想法如何解决这个问题吗?
    • @AndrewT:对不起;我不知道蟒蛇。 Here 是一些你可以参考的 C# 代码。
    猜你喜欢
    • 2013-07-12
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多