Node.js TCP echo服务器示例“socket.pipe()”出现问题



我有一个来自https://nodejs.org其回显输入。

var net = require('net');
var server = net.createServer(function (socket) {
  socket.write('Echo serverrn');
  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 Worldn");
});
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 serverrn');
  socket.pipe(socket);
});

在这里,我们只记录错误,尽管你可以用它做其他事情。

最新更新