我有一个 python websocket 服务器试图与一个 javascript websocket 客户端(嵌入在 HTML 中)进行通信。事件会emit立即从服务器编辑,但服务器发送事件触发器需要超过 30 秒,尽管客户端和服务器都在本地托管。
这是服务器的相关代码:
sio = socketio.AsyncServer(cors_allowed_origins='*')
app = web.Application() #aiohttp web server
loop = asyncio.get_event_loop()
sio.attach(app)
async def index(request):
with open('./index.html') as f:
return web.Response(text=f.read(), content_type='text/html')
app.router.add_get('/', index)
app.router.add_get('/index.html', index)
if __name__ == '__main__':
web.run_app(app)
事件是这样触发的(编辑,这必须通过事件循环来完成,emit从同步函数运行的异步函数也是如此。):
print('Starting event')
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(sio.emit('ChangeProgressState'))
loop.close()
print('Event has been fired.')
但是,打印语句会立即显示。在客户端,我正在连接并尝试使用这样的事件:
const socket = io.connect("http://localhost:8080", {
transports: ['websocket']
})
socket.on("ChangeProgressState", function (data) {
console.log("got event.")
//some code here...
});
但是,从触发事件到 javascript 套接字注意到的时间可能很长,从 30 秒到有时几分钟。我在这里做错了吗?
应该注意的是,消耗的资源非常少(2%-5%)(内存和 CPU),所以我目前认为这不是问题。任何帮助将非常感激。
编辑 2019 年 11 月 15 日:我尝试查看应用程序的网络选项卡(树莓派上的铬浏览器)。它似乎显示了初始套接字连接,但它没有显示任何套接字之间的通信,即使在事件最终触发之后也是如此。
编辑2:这绝对是服务器端的问题。我基本上可以立即将事件从 JS 客户端发送到 python 服务器,但反之则需要很长时间才能到达。我不太清楚为什么。