Параллелизм в Node JS Socket - PullRequest
0 голосов
/ 21 мая 2019

Это схема моего приложения: Сервер: каждые 20 мс отправлять новые данные клиенту.Клиент: получить данные с сервера и поработать на нем.Данные обычно большие, а вычисления занимают много времени (около 6 сек).Вот мой код в клиенте:

clientSocket.on('data', chunk => {
    try {
        console.log(`=> Message size: ${clientSocket.bytesRead}`);
        formatMessages(chunk);
    } catch (error) {
        console.log(`=> Error: ${error}`);
    }
});
async function formatMessages(chunk) {
    var dataString = chunk;
    console.log(`=> data: ${dataString}`);
    if (dataString.length == 4 /** || dataString.length == 8 || dataString.length == 12 */) {
        lastMessageLength = dataString;
        console.log(`=> Data is HEADER => ${dataString}`);
    } else {
        if (lastMessageLength != 0) {
            // Only message
            if (chunk.length == lastMessageLength) {
                console.log(`=> Chunk length is correct`);
                console.log(`=> \t Message is ${chunk}`);
                listReceivedMessages.push(lastMessageLength + dataString);
            } else {
                console.log(`=> Chunk length is wrong`);
            }
            lastMessageLength = 0;
        } else {
            // Message with message length
            console.log(`=> Message with message length`);
            var messageSliced = chunk;
            do {
                let messageLength = parseInt(messageSliced.slice(0, 4));
                let messageData = messageSliced.slice(4, messageLength + 4);
                messageSliced = messageSliced.slice(4 + messageLength);
                console.log(`=> Message length: ${messageLength}`);
                console.log(`=> Message data: ${messageData}`);
                listReceivedMessages.push(messageLength + messageData);
            } while (messageSliced != '');
        }
    }
}

Пример кода сервера находится здесь:

https://jsfiddle.net/imohammadi/w46jx0v2/2/

Проблема заключается в том, когда сокет получает данные от серверав клиенте данные отправляются для вычислений, и пока данные не вычисляются, многие другие данные получают, и приложение вычисляет неправильноЕсли я проверяю только один раз для отправки данных с сервера на клиент, все в порядке, но когда данные отправляются постоянно, все не так.Как я могу это исправить?


Обновление 1: я обнаружил, что иногда сервер отправляет данные в 2 части!это причина ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...