вернуть ответ от сервера в код

Учусь работать с websocket. Написал тестовый клиент и сервер. Проверил, все работает, данные передаются. Однако если обращаться из кода клиента к серверу за данными, то не получается вернуть их обратно в код и продолжить выполнение с полученными данными.

Искал возможность ответа сервера на запрос — не нашел. Придумал костыль. При отправке запроса клиент генерирует id и отправляет его вместе с запросом на сервер. Он возвращает ответ с айди, клиент сравнивает полученный id и сохраненный. Если совпадают, передает данные. Нарисовал, как это должно работать в голове.

На практике обломался ибо не могу заставать код ожидать нужного ответа. Информации в интернете не нашел, обращаюсь сюда за помощью.

Сервер на nodejs, клиент на python (библиотека websoket).

Сервер:

const http = require("http");
const express = require( "express");
const WebSocket = require("ws");
let CLIENTS = {};

const app = express();

const server = http.createServer(app);

const webSocketServer = new WebSocket.Server({ server });

const dispatchEvent = (message, ws) => {
    const json = JSON.parse(message);
    if (json.data.action == "test") {
        let toSend = JSON.stringify({id: json.id, action: "return_data", data: {text: "Hello World!"}})
        console.log(toSend);
        ws.send(toSend)
    }
}

webSocketServer.on('connection', (ws, req) => {
    ws.on('message', m => dispatchEvent(m, ws));
    ws.on("close", (code, reason) => delete CLIENTS[req.url.replace('/?client=', '')])
    ws.send(JSON.stringify({message: 'Hi there, I am a WebSocket server'}));
    CLIENTS[req.url.replace('/?client=', '')] = ws;
});

server.listen(3000, () => console.log("Server started"))

Клиент:

import websocket
import json
import rel

class CONNECTION:
    id = 0
    def on_message(self, ws, message):
        print(type(message))
        message = json.loads(message)
        print(message)
        if message["action"] == "sendmessage": pass
        else: return message["data"]
    def on_close(self, ws, close_status_code, close_msg):
        print(ws.clean)
        print("### closed ###")
    def on_error(self, ws, error):
        print(error.__dict__)
    def on_open(self, ws):
        print("Opened connection")
    def dexchange(self, data, action):
        if action == "send":
            self.id += 1
            return self.send({"id": self.id, "data": data})
        elif action == "receive":
            print(data)
            data = json.loads(data)
            if data["id"] == self.id: return data["data"]
    def send(self, data):
        print(data)
        ws.send(json.dumps(data));
        return self.on_message()

connection = CONNECTION()


def code():
    print(connection.dexchange({"action": "test"}, "send"))


if __name__ == "__main__":
    ws = websocket.WebSocketApp("ws://localhost:3000/?client=python",
                              on_open=connection.on_open,
                              on_message=connection.on_message,
                              on_error=connection.on_error,
                              on_close=connection.on_close)
    ws.run_forever(dispatcher=rel )  # Set dispatcher to automatic reconnection
    code();
    rel.signal(2, rel.abort)  # Keyboard Interrupt
    rel.dispatch()

Ошибка находится в CONNECTION.send на последней строке ибо вызываю функцию без параметров (хз, что туда передать)


Ответы (0 шт):