gpt4 book ai didi

node.js - 从输入流 CLI 读取数据 - NodeJS

转载 作者:太空宇宙 更新时间:2023-11-03 22:15:04 25 4
gpt4 key购买 nike

我正在阅读《Node.js in Action》一书,并尝试其中的示例。其中一个示例从“net”创建一个 channel ,然后为所有连接创建一个 channel 并向其他连接/ channel 广播消息。

var events = require('events');
var net = require('net');

var channel = new events.EventEmitter();
channel.clients = {};
channel.subscriptions = {};

channel.on('join', function (id, client) {
this.clients[id] = client;
this.subscriptions[id] = function (senderId, message) {
if (id !== senderId) {
this.clients[id].write(message);
}
};
this.on('broadcast', this.subscriptions[id]);
});

channel.on('leave', function(id) {
channel.removeListener('broadcast', this.subscriptions[id]);
channel.emit('broadcast', id, id + " has left the chat. \n");
});

channel.on('shutdown', function() {
channel.emit('broadcast', '', "Chat has shut down.!\n");
channel.removeAllListeners('broadcast');
});

var server = net.createServer(function (client) {
var id = client.remoteAddress + ':' + client.remotePort;
//client.on('connect', function () {
channel.emit('join', id, client);
//});
client.on('data', function (data) {
data = data.toString();
if(data == "shutdown\r\n") {
channel.emit('shutdown');
}
channel.emit('broadcast', id, data);
});
client.on('close', function() {
channel.emit('leave', id);
});
});

server.listen(8888);

现在,如果您查看以下代码:

client.on('data', function (data) {
data = data.toString();
if(data == "shutdown\r\n") {
channel.emit('shutdown');
}
channel.emit('broadcast', id, data);
});

当您使用以下命令使用 telnet 连接到此服务器时,它会从命令行读取数据:

telnet 127.0.0.1 8888

您可以从多个终端/shell 连接到在本地主机端口 8888 上运行的该服务器,但是当涉及到从 telnet 读取输入流时,它会在用户输入时立即读取数据。因此,如果我想检测带有回车符和换行符(\r\n)的字符串“shutdown”,我无法做到这一点,因为每次击键都会调用回调函数,所以你得到的是“s”“h” “u”“t”...“n”作为单个字符而不是字符串缓冲区。

我在API中看到有流动模式和暂停模式,但不知道如何在这里实现。

我在书中遇到了另一个例子,我通过将其与字符代码进行比较并手动缓冲直到遇到回车键来修复它,但我期待更好的解决方案,最好是如果node.js有东西提供。

var net = require('net');

var line = '';
var server = net.createServer(function(socket) {
socket.on('data', function(data) {
if(data.toString().charCodeAt(0) != 13){
line += data.toString();
} else {
//console.log('OO');
socket.write(">>");
socket.write(line);
socket.write("\r\n");
line = '';
}
});

socket.once('data', function(data) {
socket.write("Hey first time I always stay little reluctant..! Lolz!");
})
});

server.listen(88);

上面的代码是我在另一个示例中使用的修复程序,我遇到了类似的问题,但我想知道修复此问题的标准方法。

最佳答案

我刚刚尝试了原始代码,它在我的 Mac 上按预期工作。正如我怀疑的那样,您的 telnet 客户端已禁用 LINEMODE 并设置为一次字符

LINEMODE 中,telnet 仅在按 Enter 键时发送您键入的内容,但禁用它后,每次击键都会立即发送。

因此,该问题与 Node.js 或您的代码无关,而是与 telnet 客户端有关。

您可以使用模式线模式字符在两个选项之间切换。

关于node.js - 从输入流 CLI 读取数据 - NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31507590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com