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.py
和 second_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())
关于连接到具有多个客户端的一台服务器,有大量信息和示例。但是我想知道有没有办法让一个客户端同时连接到两个服务器?这是我的情况:
我有一个 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.py
和 second_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())