【问题标题】:node.js buffering tcp data and delimitersnode.js 缓冲 tcp 数据和分隔符
【发布时间】:2012-07-20 19:14:21
【问题描述】:

我正在尝试编写一个快速而肮脏的 tcp 服务器,但遇到了分隔符问题。根据this question,我正在缓冲传入数据并寻找分隔符(在本例中为'\r\n'。但是,当我远程登录并发送消息时

foo\r\nbar

下面的服务器无法识别中间的分隔符,但确实在末尾看到了一个 \r\n - 我的印象是 telnet 只发送一个 \n。当我通过 ruby​​ 脚本发送消息时,任何地方都无法识别分隔符,即使消息中存在 \r\n。

是否有一些我需要注意的 js 字符串处理行为?

var net = require("net");
var http = require('http');

var HOST = '127.0.0.1';
var PORT = 6969;
var TCP_DELIMITER = '\r\n';
var TCP_BUFFER_SIZE = Math.pow(2,16);
net.createServer(function(sock) {
    console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);

    // To buffer tcp data see:
    // https://stackoverflow.com/questions/7034537/nodejs-what-is-the-proper-way-to-handling-tcp-socket-streams-which-delimiter
    buf = new Buffer(TCP_BUFFER_SIZE);  //new buffer with size 2^16

    processTCP = function(msg) {
        // process messages
        console.log("processTCP: "+msg);
    }

    // socket handlers
    sock.on('data', function(data) {
        // look for separator '\r\n'

        console.log("data='"+data+"'");

        data = data.toString('utf-8');
        if(data.indexOf(TCP_DELIMITER) == -1) {
            console.log("1 PART MSG, INCOMING");
            buf.write(data.toString()); // write data to buffer
        } else {
            parts = data.toString().split(TCP_DELIMITER);
            console.log("Parts: "+parts);

            if (parts.length == 2) {
                console.log("2 PART MSG, INCOMING");
                msg = buf.toString() + parts[0]; // and do something with message
                processTCP(msg);
                buf = (new Buffer(TCP_BUFFER_SIZE)).write(parts[1]); // write new, incomplete data to buffer
            } else {
                console.log(parts.length+" PART MSG, INCOMING");
                msg = buf.toString() + parts[0];
                processTCP(msg);
        for (var i = 1; i <= parts.length -1; i++) {
                    if (i !== parts.length-1) {
                        msg = parts[i];
                        processTCP(msg);
                    } else {
                        buf.write(parts[i]);
                    }
        }
            }
        }

        console.log('DATA ' + sock.remoteAddress + ': ' + data);
        // Write the data back to the socket, the client will receive it as data from the server
        sock.write('You said "' + data + '"');   
    });
    sock.on('close', function(data) {
        console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort);
    });
}).listen(PORT, HOST);
console.log('Server listening on ' + HOST +':'+ PORT);

【问题讨论】:

    标签: node.js tcp


    【解决方案1】:

    其实你贴的代码没有问题,运行正常。

    当您使用 telnet 发送字符串 "\r\n" 时,它只会将其作为文字传递,所以我不太理解那个示例(也许您粘贴了它?)。

    另外,我在processTCP 中注释掉了console.log 调用。

    使用此代码对其进行测试(您可以直接从node.js 的控制台运行它):

    require('net').connect(6969, '127.0.0.1').write('segment1\r\nsegment2');
    

    我在服务器端得到的结果:

    Server listening on 127.0.0.1:6969
    CONNECTED: 127.0.0.1:34960
    Parts: segment1,segment2
    2 PART MSG, INCOMING
    DATA 127.0.0.1: segment1
    segment2
    CLOSED: undefined undefined
    

    显然,您的代码运行良好。

    【讨论】:

      【解决方案2】:

      如果您的服务器收到如下消息,则会出现问题:

      ECHO 我爱你\r

      \n

      分隔符在两个包中接收。

      【讨论】:

        猜你喜欢
        • 2010-09-22
        • 1970-01-01
        • 2015-06-10
        • 2011-08-22
        • 1970-01-01
        • 2018-02-14
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多