1

我正在尝试将传感器信息从 NodeJs 实例发送到另一个(最终在另一台服务器上)。当下面客户端代码中的 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());
//}
4

1 回答 1

2

Node 的主事件循环是单线程的,因此在任何时候都只执行一件事。特定线程不会将控制权交还给事件循环以继续处理更多事件,直到完成为止。Socket.write调用时实际上并不写入套接字;相反,它会在事件循环队列中创建一个任务。while 循环导致当前线程永远不会退出并有效地阻塞事件循环,因此永远不会处理后续的套接字写入事件。

用它替换您的客户端代码应该可以有效地实现您想要做的事情:

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函数还提供了一个回调,一旦数据完成写入套接字,就会调用该回调。

于 2019-03-05T00:56:12.523 回答