我试图制作一个简单的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"
)
答案 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