Хлопая эхо-сервер TCP в Nodejs - PullRequest
0 голосов
/ 05 октября 2018

Я попытался создать простой TCP-эхо-сервер, который сначала считывает все входные данные, прежде чем отправляет его копию.

var net = require('net');

var server = net.createServer(function(socket) {
    socket.write('Echo server\r\n');

    //socket.pipe(socket)

    socket.UsrData='';
    socket.on('data', function(chunk){
            socket.UserData+=chunk;
    });
    socket.on('end', function(){
            console.log('end');
            socket.end(socket.UserData);
    });
});
server.listen(1337, 'localhost');

Теперь, если я отправлю файл на этот сервер с

nc  -q0 localhost 1337 </etc/profile

сбой сервера:

end
events.js:183
      throw er; // Unhandled 'error' event
      ^

Error: This socket has been ended by the other party
    at Socket.writeAfterFIN [as write] (net.js:364:12)
    at Socket.Writable.end (_stream_writable.js:563:10)
    at Socket.end (net.js:509:31)
    at Socket.<anonymous> (/home/petr/f/learn/nodejs/echo.js:20:11)
    at emitNone (events.js:111:20)
    at Socket.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)

Как это исправить?

(я бы хотел, чтобы сервер работал как

socat  TCP4-LISTEN:1337,reuseport,fork EXEC:'./slurp'

, где ./slurp - это что-то вроде:

#!/bin/sh -eu
inp=$(cat)
printf '%s\n' "$inp"

)

1 Ответ

0 голосов
/ 06 октября 2018

По умолчанию сокет Node.js закрывается, как только он замечает, что другой конец соединения инициировал разъединение.Таким образом, у вашего сервера нет возможности отправлять данные клиенту.К тому времени, когда в вашей программе возникает событие 'end', ваш сокет уже закрыт, и вы получаете сообщение об ошибке, потому что программа пытается отправить собранный UserData в закрытый сокет.

Чтобы получить поведениевы хотите, вы должны сказать сокету не закрываться, когда он видит, что другой конец инициировал разъединение.Сделайте это, передав объект параметров в качестве первого аргумента net.createServer, где этот объект содержит параметр с именем allowHalfOpen со значением true, например:

    net.createServer( { allowHalfOpen: true }, function(socket) { ... } );

(Ваше существующее соединениефункция -handler становится вторым аргументом этого вызова.) После этого ваш сокет останется открытым и программа сможет отправлять накопленные UserData.

Подробнее см. https://nodejs.org/docs/latest-v8.x/api/net.html#net_net_createserver_options_connectionlistener

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