我正在尝试将传感器信息从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());
//}
答案 0 :(得分:1)
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
函数还提供了一个回调,一旦完成向套接字的数据写入,就会调用该回调。