如何在套接字完成之前从网络套接字读取数据
How to read data from web socket before socket completion
我正在尝试在 Python 中构建客户端-服务器应用程序。
我的客户端使用请求模块连接到服务器并上传 json 和文件。
服务器使用tornado框架。当服务器从客户端接收到数据时,它们开始处理并将结果分部分发送给客户端。
我的 post 处理程序示例:
class PostAd(tornado.web.RequestHandler):
def post(self):
jdata = self.get_body_arguments('json', False)[0]
jdata = json.loads(jdata)
id = self.insert_ad(jdata)
fpath_list = self.save_files(self.request.files.values(), id)
self.insert_file_path(id, fpath_list)
self.write("Successfully posted into SQL with sql id: {0}".format(id))
self.flush()
self.write("Are u there?")
self.finish()
在客户端请求中用于post数据
r=agent.post("http://localhost:8888/api/v1/add-ad", data={"json": thread_data}, files=files)
这样我无法接收数据,因为 r=agent.post 会等到服务器关闭连接,但每次当龙卷风服务器用 [=25= 向我发送数据时,我都需要检查返回值]() 命令(在我的示例中,我希望得到两个答案,第一个:"Successfully posted into SQL with sql id: 100" 和第二个:"Are u there?")。
是否可以使用请求模块来完成,或者我需要在这里使用其他东西?
我不知道 agent.post()
是什么,但是您可以使用 tornado 的 HTTP 客户端和 streaming_callback
选项来做到这一点。不过,您必须自己格式化请求正文,因为 Tornado 没有内置的客户端支持多部分文件上传。
await AsyncHTTPClient().fetch(url, body=encoded_body, streaming_callback=print)
无法保证 streaming_callback
观察到的块将与对 flush
的调用保持一致,因此您应该格式化数据,以便客户端可以确定消息的开始或结束位置。
我正在尝试在 Python 中构建客户端-服务器应用程序。 我的客户端使用请求模块连接到服务器并上传 json 和文件。
服务器使用tornado框架。当服务器从客户端接收到数据时,它们开始处理并将结果分部分发送给客户端。 我的 post 处理程序示例:
class PostAd(tornado.web.RequestHandler):
def post(self):
jdata = self.get_body_arguments('json', False)[0]
jdata = json.loads(jdata)
id = self.insert_ad(jdata)
fpath_list = self.save_files(self.request.files.values(), id)
self.insert_file_path(id, fpath_list)
self.write("Successfully posted into SQL with sql id: {0}".format(id))
self.flush()
self.write("Are u there?")
self.finish()
在客户端请求中用于post数据
r=agent.post("http://localhost:8888/api/v1/add-ad", data={"json": thread_data}, files=files)
这样我无法接收数据,因为 r=agent.post 会等到服务器关闭连接,但每次当龙卷风服务器用 [=25= 向我发送数据时,我都需要检查返回值]() 命令(在我的示例中,我希望得到两个答案,第一个:"Successfully posted into SQL with sql id: 100" 和第二个:"Are u there?")。
是否可以使用请求模块来完成,或者我需要在这里使用其他东西?
我不知道 agent.post()
是什么,但是您可以使用 tornado 的 HTTP 客户端和 streaming_callback
选项来做到这一点。不过,您必须自己格式化请求正文,因为 Tornado 没有内置的客户端支持多部分文件上传。
await AsyncHTTPClient().fetch(url, body=encoded_body, streaming_callback=print)
无法保证 streaming_callback
观察到的块将与对 flush
的调用保持一致,因此您应该格式化数据,以便客户端可以确定消息的开始或结束位置。