вернуть ответ от сервера в код
Учусь работать с 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 на последней строке ибо вызываю функцию без параметров (хз, что туда передать)