node.js Как ждать ответа сокета сервера после отправки - PullRequest
0 голосов
/ 14 июня 2019

Моя проблема здесь в том, что мне нужно связаться с сервером, и каждый раз, когда я отправляю сокет UDP, сервер отвечает. Здесь каждый раз, когда я отправляю сообщение, мне нужно дождаться ответа или организовать ответы, которые будут использованы позже, прежде чем я сделаю запрос снова.

Я не привык к node.js и понял, что вместо использования команд send и recv (я создал похожую программу на python с сокетом), есть событие, которое срабатывает, когда данные поступают на мой клиент, я пытался использовать функции обратного вызова, но я не знаю, как я ожидаю события, чтобы продолжить выполнение функции или сохранить данные, поступившие в переменную, и проверить переменную, если данные, которые я хочу, поступили.

var dgram = require('dgram');
var read_result = [];
var udpsocket = dgram.createSocket('udp4');

udpsocket.on('message', function (message, remote) {
    read_result.push(message.toString("hex"));
    console.log(remote.address + ':' + remote.port +' - ' + message.toString('hex'));
});


function executeCommand_read(message){
    var BufferData = new Buffer.from(message, "hex");
    sendRawSocket(BufferData);

    //i want to return here the result from here

    //return resultData

}

function sendRawSocket(BufferData){
    udpsocket.send(BufferData, 0, BufferData.length, 9600, '192.168.250.1', function(err, bytes) {
        if (err) throw err;
        console.log('UDP message sent, the bytes: ' + bytes + " the data " + BufferData.toString('hex'));
    });
}

executeCommand_read('800003000100003700010101320064010002');
executeCommand_read('800003000100003700010101320064010002');
executeCommand_read('800003000100003700010101320064010002');
executeCommand_read('800003000100003700010101320064010002');
executeCommand_read('800003000100003700010101320064010002');
executeCommand_read('800003000100003700010101320064010002');

в этом случае результат:

UDP сообщение отправлено, байтов: 18 данных 800003000100003700010101320064010002

UDP сообщение отправлено, байтов: 18 данных 800003000100003700010101320064010002

UDP сообщение отправлено, байтов: 18 данных 800003000100003700010101320064010002

UDP сообщение отправлено, байтов: 18 данных 800003000100003700010101320064010002

UDP сообщение отправлено, байтов: 18 данных 800003000100003700010101320064010002

UDP сообщение отправлено, байтов: 18 данных 800003000100003700010101320064010002

192.168.250.1: 9600 - c0000200370000010001010100000101

192.168.250.1: 9600 - c0000200370000010001010100000101

192.168.250.1: 9600 - c0000200370000010001010100000101

192.168.250.1: 9600 - c0000200370000010001010100000101

192.168.250.1: 9600 - c0000200370000010001010100000101

192.168.250.1: 9600 - c0000200370000010001010100000101

он читает, и ответы верны, но я не знаю, как с ними обращаться, когда я все еще в функции executeCommand_read, чтобы вернуть их тому, кто ее вызывает. Я хочу сделать таймер, и каждый раз, когда я вызываю эту функцию, я хочу, чтобы результат обновлял значения вне этого.

Пытался поместить событие message внутри обратного вызова send, пытался сохранить ответы сервера и создать цикл, чтобы при получении правильных данных возвращало значение, но я действительно не знаю, как это сделать ...

Пожалуйста, помогите

...