【问题标题】:How do I use python sockets to send an api response over a connection?如何使用 python 套接字通过连接发送 api 响应?
【发布时间】: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。这引导我朝着正确的方向前进,我现在开始工作了。下次我会尝试发布更具重现性的代码。

标签: python sockets server


【解决方案1】:

action = "".join(fragments) 行服务器代码不会运行,因为fragments 是bytes not string,所以你需要b''.join(fragments) 加入字节

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2010-12-30
    • 2019-06-12
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多