Python套接字子进程连接一段时间后没有回复

问题描述 投票:1回答:1

我正在使用python套接字与后端服务进行通信(B < - > C,如下面的结构所示​​):

                spawn                    Popen
 NodeJS server ------- Python Subprocess ------ backend process
         A                      B                     C

每次当我启动套接字时,它都很有效 - 但是当我停止测试时,经过几个小时我再次测试它时,它将不会返回答案。

我听说可能有一个问题:

如果客户端由于某种原因断开连接,您将从conn.recv获取EOF(空字符串)。然后你将写一个空字符串(零字节)并刷新到p.stdin,这是一个无操作。然后你的子进程将永远等待。

但是我该如何解决这个问题呢?

我改进了我的代码,但仍然没有工作。这是代码:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, port))
p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
s.listen(10)

conn, addr = s.accept()

while(conn):
    data = conn.recv(1024)
    while(data):
        if not data:
            break
        p.stdin.write(data)
        p.stdin.flush()
        result = p.stdout.readline()
        conn.sendall(result)
        break
    conn.close()
    conn, addr = s.accept()
s.close()

有什么想改进代码吗?谢谢。

python sockets subprocess
1个回答
0
投票

该程序的逻辑是:

while connected:
    send request from network peer to backend
    send reply from backend to network peer

它容易崩溃的原因是因为它假设一个网络读取返回一个请求。然而,对于网络流(即TCP),不能保证数据边界。输入可以到达一个数据包,但也可以在几个网络数据包中,并且可能需要多次读取(或recvs)来获取整个数据 - 即使另一端在一次网络写入中发送它。

当不完整的请求被发送到后端进行处理时,程序会等待回复,而后端仍然等待请求的其余部分。通信不同步,结果就是死锁。

要修复它,两个程序都必须遵循通信协议规则。何时发送,发送什么以及何时接收。

© www.soinside.com 2019 - 2024. All rights reserved.