大家好,谢谢你们抽出时间。在前几天,我经历了一个我的小项目,创建一个线上聊天机器人。我理解API,但遇到了一个问题。我正在尝试让我的chabot使用在线回复用户的文本。为了实现这一点,我尝试在python和JavaScript之间使用websocket。我使用的API在Python中,因此websocket也必须用python编写。我选择了异步websockets。简而言之,我试图从在线的用户输入中获取一个响应->通过websocket将响应发送到浏览器控制台中的我的javascript -> javascript将继续它的逻辑并将响应发送回服务器->该程序将继续执行它的执行。我的问题是,Websocket编程和我的Line编程都使用一个循环。线路代码可在
https://github.com/fadhiilrachman/line-py/blob/master/examples/groupbot.py
正如您在代码末尾看到的,有一个while语句,它对每条消息一次又一次地跟踪READ_MESSAGE函数。您可以忽略NOTIFIED_LEAVE 1。因此,基本上,我的代码在继续执行自己的逻辑时,然后执行如下操作:
else:
#ExternalBot code
ExtText = text[6:]现在,我希望通过我的websocket将这个ExtText发送到我的javascript,它将从浏览器获取一个响应并将其发回。javascript将执行如下操作:
exampleSocket = new WebSocket("ws://192.168.1.9:8765/")
exampleSocket.onmessage = function(e){
var server_message = e.data;
console.log(server_message);
(logic)
exampleSocket.send(response);这就是问题的开始,因为我根本不知道该如何进行。python异步Websockets需要一个循环来运行,如下所示:
async def Send(websocket, path):
await websocket.send(ExtText)
await Receive(websocket, path)
async def Receive(websocket, path):
resposne = await websocket.recv()
if response is None:
await Recieve(websocket, path)
else:
print (Response)
start_server = websockets.serve(Send,'192.168.1.9','8765')
loop = asyncio.get_event_loop()
loop.run_untill_complete(start_server)
loop.run_forever()
(continue to do a line.send() the response back to the client on Line.)这是我目前的代码。现在的问题是,如果我从来没有用类似loop.call_soon_threadsafe(loop.stop)之类的东西来关闭循环,那么它将继续运行,然后消息将永远不会被发送回客户机(程序将不会继续执行它的行逻辑)。如果我确实关闭了循环,那么服务器实际上是“关机”。如果服务器关闭并重新打开我必须通过websocket发送的每一条消息,那么我现在面临的问题是让我的JavaScript不断地尝试重新连接到服务器上的每一条消息。我尝试过这一点,但从未成功地让Javascript继续尝试建立连接。我尝试过使用Javascript websocket readyState属性,但这也不起作用。我之所以来到这里,只是因为我不知道如何继续下去,也不知道该做些什么。你们怎么建议我继续,关闭循环,或者以某种方式让它打开,但继续我的程序逻辑。如果是这样的话,您将如何将其实现到我已经循环的代码中(一行虽然是true语句)?我真的为这么长的问题道歉,但我完全被困住了。感谢你们的时间,决定阅读和帮助我的人,我真的很感激。
发布于 2018-06-03 01:32:40
经过几天的研究,我已经通过将循环分成两个python脚本并在它们之间进行通信来解决这个问题。如果在座的任何人有类似的问题,并希望得到更深入的解释,请随时问我。
https://stackoverflow.com/questions/50458910
复制相似问题