我正在写一个两个服务器之间的桥,我对如何正确地做这件事感到困惑。我有一个socketio服务器,它向我发送了一条消息,我需要转换并重新路由到WebSocket。
看看我的第一次尝试:
import socketio
import asyncio
import websockets
the_socketio_adress = 'http://localhost:1234'
the_websocket_adress = 'ws://localhost:1235'
my_socketio_client = socketio.Client()
#THIS DOES NOT WORK
@my_socketio_client.on('message')
def on_message(data):
messageId = data['messageId']
value = data['value'] if 'value' in data else None
if messageId == "requiredTag":
event = {"sender":"myclients_name",messageId:value}
**websocket.send(json.dumps(event))**
#THIS DOES NOT WORK:END
my_socketio_client.connect(my_socketio_adress)
async def listen_to_websocket_server():
async with await websockets.connect(my_websocket_adress) as websocket:
while 1:
response = await websocket.recv()
response_dict = json.loads(response)
response_list = extract_values(response_dict, [], [])
for keyvaluepair in response_list:
my_socketio_client.emit('message_from_websocketserver', {'messageId':keyvaluepair[0], 'value':keyvaluepair[1]})
asyncio.run(listen_to_websocket_server())
我想这可能是一个解决方案,但我不明白如何在my_socketio_client
的函数on_message(data)
中使用WebSocket,或者这是否可能。问题是,on_message(data)
在事件发生时被调用一次,但是我认为在这个函数中使用正在运行的WebSocket是不可能的。我看到的唯一解决方案是总是在on_message(data)
上连接一个新的WebSocket,但这将是低效的。是否有一个选项可以使用一个websocket并将其分配给全局变量或其他东西,所以我可以通过同一个WebSocket接收和发送,但在多个功能?afaik
websocket = websockets.connect(...)
不起作用,因为websocket.recv()
说Connect
-Object没有recv方法。另外,一个WebSocket需要是异步的,只能在异步函数中使用,而on_message(data)
不是。
我在考虑使用队列,但仍然,我需要一个接收和发送两个不同功能的WebSocket,并且不想为此使用两个websocket(因为我甚至不认为这是可能的,因为我的websocket连接到的服务器的实现)。
我已经看到python-websocket-server-forwards-messages-from-other-websocket-server,但他们没有提供任何解决方案
1条答案
按热度按时间w1jd8yoj1#
我使用create_connection解决了这个问题,这使得它能够拥有一个全局WebSocket,并在socketio函数回调
on_message(data)
中使用它。Is there a WebSocket client implemented for Python?