Node.js `socket.pipe()` 的 TCP 回显服务器示例问题

Node.js TCP echo server example issue with `socket.pipe()`

我有来自 https://nodejs.org 的这个例子,它回显了输入。

var net = require('net');

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

server.listen(1338, 'localhost');

我使用这个 ruby 脚本发送数据:

require 'socket'
a = TCPSocket.new('localhost', 1338) # could replace 127.0.0.1 with your "real" IP if desired.
a.write "hi server!"
puts "got back:" + a.recv(1024)
a.close

但是,我遇到了这个错误

events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: read ECONNRESET
    at exports._errnoException (util.js:746:11)
    at TCP.onread (net.js:550:26)

可能出了什么问题?当我只使用 socket.end() 时,它工作正常。

var net = require('net');
var server = net.createServer(function (socket) {
    console.log("Connection from " + socket.remoteAddress);
    socket.end("Hello World\n");

});
server.listen(1338, "localhost");

已添加

我需要修改 ruby 代码以免导致 nodejs 出错。

require 'socket'
a = TCPSocket.new('localhost', 1338) # could replace 127.0.0.1 with your "real" IP if desired.
a.write "hi server!"
puts "got back:" + a.recv(1024)
puts "got back:" + a.recv(1024)
a.close

您的 Ruby 脚本正在过早关闭连接(在读取所有数据之前)。

您的 Node.js 代码应该预见到这种可能性并加以处理:

var server = net.createServer(function (socket) {
  socket.on('error', function(err) {
    console.error('SOCKET ERROR:', err);
  });
  socket.write('Echo server\r\n');
  socket.pipe(socket);
});

这里我们除了记录错误什么都不做,尽管你可以用它做其他事情。