首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在同一套接字连接上发送多条消息?

如何在同一套接字连接上发送多条消息?
EN

Stack Overflow用户
提问于 2019-11-11 23:31:17
回答 1查看 689关注 0票数 1

我尝试通过相同的套接字连接发送一组消息,但得到一个错误。

下面是我的客户端代码:

代码语言:javascript
复制
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)时发生了异常。

下面是错误:

代码语言:javascript
复制
ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine

服务器端代码:

代码语言:javascript
复制
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的问题吗?

EN

回答 1

Stack Overflow用户

发布于 2019-11-12 23:18:08

我对巨蟒一无所知,但是...

我不认为多条消息是你的问题。看一下异常,我猜你的第一条消息是正确发送的。然后,您的客户端代码等待接收ACK;但是服务器从不发送它。相反,它会关闭连接。

此外,请确保是否应该使用sendall而不是send

修复上述问题后,要在同一连接上发送多个消息,您必须遵循MLLP (也称为LLP),以便服务器可以区分消息。

代码语言:javascript
复制
Description                 HEX     ASCII   Symbol
Message starting character  0B      11      <VT>
Message ending characters   1C,0D   28,13   <FS>,<CR>

这样,当您向侦听器(TCP/MLLP服务器)发送消息时,它会在传入数据中查找Start Block和End Block。在此基础上,它区分每条消息。

有关更多详细信息,请参阅this答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58804295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档