在Python中接收socketio上的消息并转发/重新路由/发送到WebSocket服务器

rbpvctlc  于 2023-03-30  发布在  Python
关注(0)|答案(1)|浏览(143)

我正在写一个两个服务器之间的桥,我对如何正确地做这件事感到困惑。我有一个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,但他们没有提供任何解决方案

w1jd8yoj

w1jd8yoj1#

我使用create_connection解决了这个问题,这使得它能够拥有一个全局WebSocket,并在socketio函数回调on_message(data)中使用它。
Is there a WebSocket client implemented for Python?

from websocket import create_connection
ws = create_connection("ws://localhost:8080/websocket")
print "Sending 'Hello, World'..."
ws.send("Hello, World")
print "Sent"
print "Receiving..."
result =  ws.recv()
print "Received '%s'" % result
ws.close()

相关问题