Данные не отправляют данные через сокет в цикле - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь отправить сенсорную информацию с экземпляра NodeJ на другой (в конце концов, на другой сервер).Когда цикл while в приведенном ниже коде клиента включен, соединение или данные на сервер не отправляются.Однако, когда цикл while закомментирован, я получаю соединение и данные.Это всего лишь один объект данных, но это ожидаемо, если не извлекать данные датчика из цикла.

Код сервера:

'use strict';
const net = require('net');
const PORT = 5000;
const ADDRESS = '127.0.0.1';

let server = net.createServer(onClientConnected);
server.listen(PORT, ADDRESS);

function onClientConnected(socket) {
    console.log(`New client: ${socket.remoteAddress}:${socket.remotePort}`);
    socket.destroy();
}

console.log(`Server started at: ${ADDRESS}:${PORT}`);

function onClientConnected(socket) {
    let clientName = `${socket.remoteAddress}:${socket.remotePort}`;
    console.log(`${clientName} connected.`);
    socket.on('data', (data) => {
    let m = data.toString().replace(/[\n\r]*$/, '');
    var d = {msg:{info:m}};
    console.log(`${clientName} said: ${data.toString()}`);
    socket.write(`We got your message (${m}). Thanks!\n`);
});

socket.on('end', () => {
    console.log(`${clientName} disconnected.`);
});

Код клиента:

var n = require('net');
var s = n.Socket();
s.connect(5000, 'localhost');
var i2c = require('i2c-bus');
var MPU6050 = require('i2c-mpu6050');

var address = 0x68;
var i2cl = i2c.openSync(1);
var sensor = new MPU6050(i2cl, address);

//while (true) {
    var data = sensor.readSync();
    console.log(data);
    s.write(data.toString());
//}

1 Ответ

0 голосов
/ 05 марта 2019

Основной цикл событий узла является однопоточным, поэтому одновременно выполняется только одна вещь.Определенный поток не откажется от управления обратно в цикл обработки событий, чтобы продолжить обработку большего количества событий до его завершения.Socket.write на самом деле не записывает в сокет, когда он вызывается;вместо этого он создает задачу в очереди цикла событий.Цикл while приводит к тому, что текущий поток никогда не завершается, и эффективно блокирует цикл событий, поэтому последующие события записи в сокет никогда не обрабатываются.

Замена клиентского кода этим должна работать и эффективно достигать того, что вы пытаетесьdo:

var n = require('net');
var s = n.Socket();
s.connect(5000, 'localhost');
var i2c = require('i2c-bus');
var MPU6050 = require('i2c-mpu6050');

var address = 0x68;
var i2cl = i2c.openSync(1);
var sensor = new MPU6050(i2cl, address);

const readData = () => {
    var data = sensor.readSync();
    console.log(data);
    s.write(data.toString());
    setImmediate(readData);
}

readData();

setImmediate говорит, что выполняет функцию ПОСЛЕ обработки любых других событий, в этом случае это будет событие с Socket.write.Функция Socket.write также обеспечивает обратный вызов, который вызывается после завершения записи данных в сокет.

...