使用NodeJS的“ net”模块处理TCP连接错误

时间:2020-06-12 16:52:12

标签: javascript node.js error-handling tcp

我正在尝试学习NodeJS的“ net”模块,但遇到了一个烦人的问题。我的代码在2个脚本中。

//index.js
var net = require("net")

var server = net.createServer(socket=>{
    socket.write("Hello!")
})
server.on("error", err=>{
    console.error(err)
})
server.listen(50001)

//client
var net = require("net")

net.createConnection({
    host:"localhost",
    port: 50001
})
.on("data", data=>{
    console.log(data.toString())
})

当我运行2个脚本时...

node index.js
node client.js

...消息“你好!”毫无问题地发送给客户端。如果我在客户端之外按CTRL + C(以模拟意外关闭),则会收到以下错误

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

Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:111:27)
Emitted 'error' event at:
    at emitErrorNT (internal/streams/destroy.js:82:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
    at process._tickCallback (internal/process/next_tick.js:63:19)

我发现它很奇怪,因为我已经在服务器上注册了一个“错误”事件。我究竟做错了什么?

1 个答案:

答案 0 :(得分:0)

该程序在服务器的侦听套接字上注册“错误”事件的处理程序,但未在为承载客户端建立的连接而创建的单独的新套接字上注册“错误”处理程序。 (与服务器的每个连接都会获得一个单独的新套接字,该套接字与侦听套接字和之前进行的任何其他连接都不相同。)

该新的连接套接字是作为参数传递给服务器的连接处理程序的套接字。您在套接字上输入“ Hello!”进入。

如果希望在新套接字上收到有关错误的通知,则必须在新套接字上注册“错误”处理程序。像这样:

var net = require("net")

var server = net.createServer(socket=>{
    socket.on('error', err=>{
        console.error('connected socket: ' + err);
    });
    socket.write("Hello!")
})
server.on("error", err=>{
    console.error(err)
})
server.listen(50001)

类似地,如果您希望服务器从连接中读取数据,则可以在新连接套接字上注册“数据”事件的处理程序,就像在客户端套接字上所做的一样。