从inputstreamCLI读取数据 – NodeJS

我正在阅读“Node.js in Action”一书,并尝试使用它。 其中一个例子是从“networking”创build一个频道,然后为所有连接创build一个频道,并将消息广播到其他连接/频道。

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 

你可以从多个terminal/ shell连接到本地端口8888上运行的服务器,但是当从telnet读取inputstream时 – 只要用户input数据就会读取数据。 所以,如果我想用回车符和换行符(\ r \ n)来检测string“shutdown”,我不能这样做,因为callback函数被每个击键调用,所以你得到的是“s”“h” “u”“t”…“n”作为单个字符而不是string缓冲区。

我读了API中有stream动模式和暂停模式,但不知道如何在这里实现它。

在我遇到的书中还有另外一个例子,我通过比较字符代码和手动缓冲来修复它,直到遇到回车键,但我期待着更好的解决scheme,最好是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上按预期工作。 正如我怀疑,您的远程login客户端已禁用LINEMODE并设置为character at a time

LINEMODE ,telnet仅在按下input时才发送您input的内容,而禁用它时,每个按键都会立即发送。

所以,这个问题与Node.js或你的代码无关,而是telnet客户端。

您可以使用mode linemode character在两个选项之间切换。