Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js ReadLine未在套接字连接上等待完整线路?_Javascript_Node.js_Newline - Fatal编程技术网

Javascript Node.js ReadLine未在套接字连接上等待完整线路?

Javascript Node.js ReadLine未在套接字连接上等待完整线路?,javascript,node.js,newline,Javascript,Node.js,Newline,我试图使用,就像这样: var net = require('net'); var rl = require('readline'); this.streamServer = net.createServer(function (socket) { var i = rl.createInterface(socket, socket); i.on('line', function (line) { socket.write(line); }); }); t

我试图使用,就像这样:

var net = require('net');
var rl = require('readline');

this.streamServer = net.createServer(function (socket) {
    var i = rl.createInterface(socket, socket);
    i.on('line', function (line) {
        socket.write(line);
    });
});
this.streamServer.maxConnections = 1;
this.streamServer.listen(7001);
当我将telnet连接到端口7001并开始键入文本时,它会在我按下enter键之前立即回显给我

为什么ReadLine不等待完整的一行?

我也尝试过,我得到了同样的结果。。。回调在接收到任何数据时启动,无需等待行尾字符


编辑:这变得更加奇怪。当我使用Windows telnet客户端进行测试时,我得到了上面所述的行为。但是,如果我使用PuTTY作为客户端进行测试,ReadLine可以工作,即使在Windows上也是如此。我做了一些数据包捕获。也许有人能解释一下?未插入的行是来自客户端的数据。缩进行是服务器回复

使用Windows Telnet

00000000  61                                               a
    00000000  61                                               a
00000001  62                                               b
    00000001  62                                               b
00000002  63                                               c
    00000002  63                                               c
00000003  64                                               d
    00000003  64                                               d
00000004  65                                               e
    00000004  65                                               e
00000005  66                                               f
    00000005  66                                               f
00000006  67                                               g
    00000006  67                                               g
00000007  68                                               h
    00000007  68                                               h
00000008  69                                               i
    00000008  69                                               i
00000009  6a                                               j
    00000009  6a                                               j
0000000A  6b                                               k
    0000000A  6b                                               k
0000000B  6c                                               l
    0000000B  6c                                               l
0000000C  6d                                               m
    0000000C  6d                                               m
0000000D  6e                                               n
    0000000D  6e                                               n
0000000E  6f                                               o
    0000000E  6f                                               o
0000000F  70                                               p
    0000000F  70                                               p
00000010  0d 0a                                            ..
    00000010  0d 0a                                            ..
00000012  0d 0a                                            ..
    00000012  0d 0a                                            ..
00000014  0d 0a                                            ..
    00000014  0d 0a                                            ..
00000016  61                                               a
    00000016  61                                               a
00000017  73                                               s
    00000017  73                                               s
00000018  64                                               d
    00000018  64                                               d
00000019  66                                               f
    00000019  66                                               f
0000001A  0d 0a                                            ..
    0000001A  0d 0a                                            ..
0000001C  61                                               a
    0000001C  61                                               a
0000001D  73                                               s
    0000001D  73                                               s
0000001E  64                                               d
    0000001E  64                                               d
0000001F  66                                               f
    0000001F  66                                               f
00000020  0d 0a                                            ..
    00000020  0d 0a                                            ..
使用腻子

00000000  ff fb 1f ff fb 20 ff fb  18 ff fb 27 ff fd 01 ff ..... .. ...'....
00000010  fb 03 ff fd 03                                   .....
    00000000  ef bf bd ef bf bd 1f ef  bf bd ef bf bd 20 ef bf ........ ..... ..
    00000010  bd ef bf bd 18 ef bf bd  ef bf bd 27 ef bf bd ef ........ ...'....
    00000020  bf bd 01 ef bf bd ef bf  bd 03 ef bf bd ef bf bd ........ ........
    00000030  03                                               .
00000015  61 62 63 64 65 66 67                             abcdefg
0000001C  0d 0a                                            ..
    00000031  61 62 63 64 65 66 67                             abcdefg
    00000038  0d 0a                                            ..
0000001E  61 73 64 66                                      asdf
00000022  0d 0a                                            ..
    0000003A  61 73 64 66                                      asdf
    0000003E  0d 0a                                            ..
00000024  61 73 64 66                                      asdf
00000028  0d 0a                                            ..
    00000040  61 73 64 66                                      asdf
    00000044  0d 0a                                            ..
0000002A  0d 0a                                            ..
    00000046  0d 0a                                            ..

这是node.js中的一个bug,ReadLine的接口在每个“数据”事件上调用_normalWrite(),并且_normalWrite有一条注释,它应该尝试在换行符上打断,但目前没有

类似于这一点的东西应该可以帮你解决:

i._normalWrite = function(b) {
    if(b == undefined) {
        return;
    }
    if(!this._line_buffer) {
        this._line_buffer = '';
    }
    this._line_buffer += b.toString();
    if(this._line_buffer.indexOf('\n') !=-1 ) {
        var lines = this._line_buffer.split('\n');
        // either '' or the unfinished portion of the next line
        this._line_buffer = lines.pop();
        lines.forEach(function(line) {
            this._onLine(line + '\n');
        }, this);
    }
};

我还没有对此进行测试,它可能还需要考虑
\r
。请让我知道它是否适用于您,如果适用,那么我们中的一个人应该向node发送一个拉取请求。

我的问题的替代解决方案。。。我只需要在每次有一条来自流的新线时获得某种类型的线事件。由于我不需要readline附带的所有其他功能,我在这里找到了TooTallNate的这段代码:


这是对Nathan的pull请求的评论:

看起来文档在如何工作方面与您的意见一致。可能的错误?或者它只适用于某些类型的手柄。@David SkyMesh,是的,我希望不是这样,但我认为可能是这样。我还在谷歌群组上发现了这篇文章,看起来很有关联:我试过你的例子。对我来说,它工作得很好。@cababunga,你运行Node.js的哪个版本?@cababunga,什么操作系统?我在Windows下运行相同的版本。效果很好!谢谢我只是对你的代码做了一些小改动。我编辑了你的文章以反映这些变化。你介意提交一个请求吗?我没有设置Github帐户。(此时此刻,请不要犹豫。)再次感谢!!这里是拉请求-一旦合并并发布,您将能够删除该黑客:)看起来不错,谢谢+明天早上我一有空就给你200美元。太棒了,谢谢!这实际上标志着我对node.js核心的第一次贡献,因此我认为将我的so分数提高近一倍是一个很好的庆祝方式:感谢Nathan提交修复程序。您的拉力已降落,将进入
v0.7.8
版本。干杯完全不相关,但我从未见过(~n)。真是天才。
/**
 * By TooTallNate, originally posted at https://gist.github.com/1785026
 * A quick little thingy that takes a Stream instance and makes
 * it emit 'line' events when a newline is encountered.
 *
 *   Usage:
 *   ‾‾‾‾‾
 *  emitLines(process.stdin)
 *  process.stdin.resume()
 *  process.stdin.setEncoding('utf8')
 *  process.stdin.on('line', function (line) {
 *    console.log(line event:', line)
 *  })
 *
 */

function emitLines (stream) {
  var backlog = ''
  stream.on('data', function (data) {
    backlog += data
    var n = backlog.indexOf('\n')
    // got a \n? emit one or more 'line' events
    while (~n) {
      stream.emit('line', backlog.substring(0, n))
      backlog = backlog.substring(n + 1)
      n = backlog.indexOf('\n')
    }
  })
  stream.on('end', function () {
    if (backlog) {
      stream.emit('line', backlog)
    }
  })
}