Подтвердить что ты не робот

Nodejs streaming

Я хочу реализовать простое клиент-серверное соединение с помощью Nodejs. Но я столкнулся со следующей проблемой.

Рассмотрим код

server.js:

var net = require('net'),
    sys = require('sys');

    net.createServer(onConnection).listen(8124);

    function onConnection(socket) {
     socket.setNoDelay(true);

     socket.addListener("connect", function () {
      sys.puts('client connected: ' + this.remoteAddress);
     });

     socket.addListener("data", function (data) {
      sys.puts("message: \n" + data + "\n - end of msg.");
     });

     socket.addListener("end", function () {
      sys.puts('end of connection');
      this.end();
     });
    }

    sys.puts('Server running at 127.0.0.1:8124');

client.js:

var net = require('net'),
 sys = require('sys');

var stream = net.createConnection(8124);
stream.addListener("connect", function(){
 sys.puts('connected');

 stream.write('a');
    stream.flush();
 stream.write('b');
    stream.flush();

});

stream.addListener("data", function(data){
 sys.puts("Message: \n" + data + "\n - end of msg.");
});

Когда я запускаю client.js, я иногда получаю только одно сообщение "ab" вместо двух сообщений "a" и "b".

Есть ли какой-то "правильный метод", чтобы справиться с этим?

4b9b3361

Ответ 1

TCP - это протокол потока. Единственный write на одном конце трубы может привести к нескольким "чтениям" на другом конце, а наоборот. Вы должны либо явно указать другой стороне, сколько байтов вы отправляете, включая длину сообщения; или обеспечить легко узнаваемые разделители сообщений. В любом случае вам нужно прочитать в цикле.