【问题标题】:Handling an error on a tcp connection using the "net" module of NodeJS使用 NodeJS 的“net”模块处理 tcp 连接上的错误
【发布时间】:2020-10-02 13:02:42
【问题描述】:

我正在尝试学习 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)

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

【问题讨论】:

    标签: javascript node.js error-handling tcp


    【解决方案1】:

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

    那个新的连接套接字是作为参数传递给服务器连接处理程序的那个。这是你写“你好!”的套接字。进入。

    如果您希望程序在该新套接字上收到错误通知,那么您必须在新套接字上注册一个“错误”处理程序。像这样的:

    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)
    

    同样,如果您希望服务器从连接中读取数据,那么您将在新连接套接字上为“数据”事件注册一个处理程序,就像您在客户端套接字上所做的那样。

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2020-03-10
      • 1970-01-01
      • 2016-06-19
      • 2023-03-04
      • 1970-01-01
      • 2019-03-14
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多