在Node.js中配置TCP Echo Server

时间:2018-10-05 13:55:10

标签: node.js tcp

我试图制作一个简单的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 :(得分:1)

默认情况下,一旦Node.js套接字注意到连接的另一端已启动断开连接,它就会自行关闭。因此,服务器没有机会将数据发送到客户端。在您的程序中触发“ end”事件时,您的套接字已经关闭,并且由于程序试图将收集的200,10 220,2 300,5 发送到已关闭的套接字中而导致错误。

要获得所需的行为,必须在看到另一端发起断开连接时告诉套接字不要关闭。为此,请将选项对象作为第一个参数传递给UserData,该对象包含名为net.createServer且值为allowHalfOpen的选项,如下所示:

true

(您现有的connect-handler函数将成为该调用的第二个参数。)执行此操作之后,您的套接字将保持打开状态,并且程序将能够发送累积的 net.createServer( { allowHalfOpen: true }, function(socket) { ... } );

有关详细信息,请参见https://nodejs.org/docs/latest-v8.x/api/net.html#net_net_createserver_options_connectionlistener