Python-socketio:如何将一个客户端连接到多个服务器?

Python-socketio: How to connect one client to multiple servers?

关于连接到具有多个客户端的一台服务器,有大量信息和示例。但是我想知道有没有办法让一个客户端同时连接到两个服务器?这是我的情况:

我有一个 python 客户端,它从 一台服务器 获取数据,对其进行分析并向 另一台服务器 .关于这个问题的资料好像比较少,有空再说吧。

以下是我尝试解决该问题的方法。首先,我制作了一个 socketio.Client class,这将使我能够创建两个客户端实例。它 没有 工作。我在这里错过了什么?:

import socketio

class SocketClient(socketio.Client):
    def __init__(self, server_ip):
        self.server_ip = server_ip    # server's ip address
        self.sio = socketio.Client(logger=True)

    def connect(self):
        self.sio.connect(self.server_ip, namespaces=['/my_namespace'])

    @self.sio.event
    def connect_error(self, error):
        print('connection error=> ', error)

    @self.sio.event
    def my_event(self, server_response):
        # Here I have to take the server_response 
        # and send it to another server.
        # How do I do it?
        # self.sio.emit('some_event', server_response)
        # that does not work, as I do not have the second client instance

        pass

    @self.sio.event
    def my_other_event(self, server_response):
        # process the response
        pass


# initiate the two client instances:
if __name__ == '__main__':
    first_client = SocketClient('http://192.168.100.103')
    second_client = SocketClient('http://192.168.100.104')
    first_client.connect()
    second_client.connect()

在我的第一次尝试没有成功后,我放弃了 class-实例方法,转而采用功能方法:


import socketio

first_client = socketio.Client()
second_client = socketio.Client()


@second_client.event
@first_client.event
def connect():
    print(f'connected with id {first_client.sid}')

@second_client.event
@first_client.event
def connect_error(e):
    print('Error=> ', e)


@second_client.event
@first_client.event
def disconnect():
    print('disconnected')


@first_client.event
def my_event(server_response):
    # Here I have to take the server_response 
    # and send it to another server.
    second_client.emit('some_event', server_response)   # is it even possible?
    


@second_client.event
def my_other_event(server_response):
    # handle the response
    pass

if __name__ == '__main__':
    first_client.connect('http://192.168.100.103')
    second_client.connect('http://192.168.100.104')

在这两种情况下,我在技术上都创建了两个客户端。我不妨将它们放入单独的文件中,例如 first_client.pysecond_client.py.

看到我要去哪里了吗?目标是从服务器一获取数据,处理它并将其发送到理想情况下具有一个客户端的另一台服务器。如果我在这里遗漏了一些非常明显的东西,请原谅我。非常感谢任何帮助。

P.S。 两台服务器都已启动并且 运行 没有任何问题。

我正在使用 NameSpace 来解决这个问题。

首先创建一个命名空间class

class MyCustomNamespace(socketio.AsyncClientNamespace):
    async def on_connect(self):
        print("I'm connected!")

    async def on_disconnect(self):
        print("I'm disconnected!")

    async def on_my_event(self, data):
        await self.emit('my_response', data)

    async def on_message(self, data):
        print("[echo]:", data)

class mysio:
    
    def __init__(self) -> None:
        global sio
        self.sio = socketio.AsyncClient(logger=False, engineio_logger=False)
        self.sio.register_namespace(MyCustomNamespace('/')) # bind

然后做2个客户。 因为 wait() 会阻塞进程,所以我使用 create_task().

async def main():

    async def fun1():
        sio1 = mysio().sio
        await sio1.connect('http://192.168.3.85:11451')
        await sio1.emit('message', b'11111110001')
        await sio1.wait()

    async def fun2():
        sio2 = mysio().sio
        await sio2.connect('http://localhost:8080')
        await sio2.emit('message', 'from sio2')
        await sio2.wait()

    tasks = [asyncio.create_task(fun1()),asyncio.create_task(fun2()) ]
    await asyncio.wait(tasks)

asyncio.run(main())