【发布时间】:2019-05-31 00:37:48
【问题描述】:
我试图让服务器等待客户端建立连接,从客户端获取数据,使用该数据发出 api 请求,并将响应发送给客户端。一切正常,除了将响应发送回客户端(客户端功能只是超时)。如果将 conn.sendall("anythinghere") 放在 while True 循环中,这可行,但显然不会返回我需要它返回的内容。将 conn.sendall 放在循环之外会导致客户端超时。
服务器代码
conn, addr = s.accept()
print('Connected by', addr)
fragments = []
while True:
chunk = conn.recv(4096)
if not chunk:
break
fragments.append(chunk)
action = "".join(fragments)
URL = "http://172.31.55.211/" + action
print("making request")
r = requests.get(url = URL)
data = r.json()
conn.sendall(data['message'])
客户代码
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(s)
s.connect((HOST, PORT))
s.sendall(b'hellocvs')
data = s.recv(1024)
print('Received', repr(data))
return {
'statusCode': 200,
'body': json.dumps(str(data))
}
【问题讨论】:
-
欢迎来到 SO。您的 sn-ps 不可执行。请为您的问题写MCVE
-
您的服务器一直在循环,直到客户端关闭其连接的一半写入,但这永远不会发生,因为客户端正在等待从服务器接收数据。两者都陷入僵局。相反,您需要定义一个协议,使服务器能够识别它何时接收到客户端的数据。
-
谢谢@JamesKPolk。这引导我朝着正确的方向前进,我现在开始工作了。下次我会尝试发布更具重现性的代码。