Nodejs потоковое - PullRequest
       6

Nodejs потоковое

10 голосов
/ 26 июля 2010

Я хочу реализовать простое соединение клиент-сервер, используя 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'.

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

Ответы [ 2 ]

10 голосов
/ 26 июля 2010

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

0 голосов
/ 12 апреля 2018

используйте возвращаемое значение socket.write и обратный вызов, как описано здесь https://nodejs.org/api/net.html#net_socket_write_data_encoding_callback, чтобы знать, когда данные полностью сбрасываются в ядро.Подождите, пока это произойдет, и после этого позвоните второй пишите.таким образом вы убедитесь в заказе.Что касается проблемы логического разделения «a» и «b», вы можете сами разработать / реализовать этот «протокол», это не является обязанностью (низкоуровневого) API сокета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...