一台设备上的 Python socketio badnamespaceerror 异常,但在另一台设备上不起作用

问题描述

大家好,我有以下代码,但由于某种原因,我不断收到以下错误,但它似乎可以在同事的电脑上运行。我们似乎无法弄清楚为什么这对我的不起作用。

我们还仔细检查了我们是否使用 dir() 导入了相同的 socketio

我已经尝试在 sio.connect 和 sio.emit 中指定命名空间,但仍然没有运气!

socketio.exceptions.BadNamespaceError: / is not a connected namespace.

bearerToken = 'REDACT'

core = 'REDACT'
output = 'REDACT'


import socketio
import json

def getListeners(token,coreUrl,outputId):
    sio = socketio.Client(reconnection_attempts=5,request_timeout=5)
    sio.connect(url=coreUrl,transports='websocket')

    @sio.on('mwedge:batch:stats')
    def batchStats(data):
        if (outputId in data['outputStats']):
            listeners = data['outputStats'][outputId][16]
            print("Number of listeners ",len(listeners))
            ips = []
            for listener in listeners:
                ips.append(listener[1])
            print("Ips",ips)

    def authCallback(data):
        print(json.dumps(data))

    sio.emit(event='auth',data={
        'token': token
    },callback=authCallback)


getListeners(bearerToken,core,output)

解决方法

Socket.IO 连接涉及客户端和服务器之间的许多交换。 connect() 函数会启动此过程,但这会在后台继续进行。当您的 connect 事件的处理程序被调用时,连接结束。此时就可以发出了。

您的代码的问题在于您没有等到连接握手完成,因此您的 emit() 调用在建立连接之前发生。解决方案是添加一个 connect 事件处理程序,并将您的 emit() 调用移到那里。

另外,我建议您在调用 connect() 函数之前设置事件处理程序。