3

速くて汚いtcpサーバーを作成しようとしていますが、区切り文字に問題があります。この質問ごとに、着信データをバッファリングし、区切り文字(この場合は「\ r \ n」)を探しています。ただし、Telnetで接続してメッセージを送信すると

foo\r\nbar

以下のサーバーは中央の区切り文字を認識しませんが、最後に\ r\nが表示されます-私はtelnetが\nのみを送信するという印象を受けました。ルビースクリプトを介してメッセージを送信すると、メッセージに\ 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);
4

2 に答える 2

0

実際、投稿したコードには何の問題もありません。正しく機能します。

telnetを使用して文字列"\r \ n"を送信すると、文字列として渡されるだけなので、その例を本当に理解していませんでした(おそらく貼り付けましたか?)。

console.logまた、での呼び出しをコメントアウトしましたprocessTCP

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

明らかに、コードは問題なく機能します。

于 2012-07-21T00:16:10.173 に答える
0

サーバーが次のようなメッセージを受信した場合、問題が発生します。

ECHO愛してる\r

\ n

区切り文字は2つのパッケージで受け取られます。

于 2012-09-17T04:29:04.167 に答える