Python套接字子进程连接一段时间后没有回复
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python套接字子进程连接一段时间后没有回复相关的知识,希望对你有一定的参考价值。
我正在使用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()
有什么想改进代码吗?谢谢。
答案
该程序的逻辑是:
while connected:
send request from network peer to backend
send reply from backend to network peer
它容易崩溃的原因是因为它假设一个网络读取返回一个请求。然而,对于网络流(即TCP),不能保证数据边界。输入可以到达一个数据包,但也可以在几个网络数据包中,并且可能需要多次读取(或recvs)来获取整个数据 - 即使另一端在一次网络写入中发送它。
当不完整的请求被发送到后端进行处理时,程序会等待回复,而后端仍然等待请求的其余部分。通信不同步,结果就是死锁。
要修复它,两个程序都必须遵循通信协议规则。何时发送,发送什么以及何时接收。
以上是关于Python套接字子进程连接一段时间后没有回复的主要内容,如果未能解决你的问题,请参考以下文章
window error 10060 由于连接方在一段时间后没有正确答复或者连接主机没有反应,连接尝试失败!