Основной цикл событий узла является однопоточным, поэтому одновременно выполняется только одна вещь.Определенный поток не откажется от управления обратно в цикл обработки событий, чтобы продолжить обработку большего количества событий до его завершения.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
также обеспечивает обратный вызов, который вызывается после завершения записи данных в сокет.