Node.js TCP套接字net-检测到客户端关闭并出现服务器端错误

问题描述

在Node.js中,HTTP服务器很容易通过print(self.onChanged())事件检测突然关闭的客户端,并通过检查客户端关闭代码不是WebSocket服务器中的request.on('abort')

但是对于TCP服务器,似乎没有明显的方法让服务器检测到由于某种错误情况而关闭了其中一个客户端。我不是在谈论1000事件,该事件在套接字变为“空闲”或心跳以跟踪网络更改时的静断开连接时发出,我对服务器最简单的方式(实际上是任何方式)感兴趣告诉客户对方实际上是因错误关闭的。

为说明,服务器:

timeout

和客户:

const net = require('net')

const server = net.createServer(socket => {
  socket
    .on('end',() => {
      console.log({ e: 'end' })
    })
    .on('close',hadError => {
      console.log({ e: 'close',hadError })
    })
    .on('error',err => {
      console.log({ e: 'error',err })
    })
})

server.listen({ port: 9090,host: '127.0.0.1' })

现在,如果使用const net = require('net') const socket = net.createConnection({ port: 9090,host: '127.0.0.1' }) socket .on('connect',() => { console.log({ e: 'connect' }) }) .on('end',() => { console.log({ e: 'end' }) }) .on('close',hadError => { console.log({ e: 'close',hadError }) }) .on('error',err => { console.log({ e: 'error',err }) }) setTimeout(() => { socket.end() // OR socket.destroy(new Error('Closing due to some severe error condition')) },1000) 关闭了客户端套接字,则服务器/客户端控制台的日志输出分别为:

end

如果使用// Server { e: 'end' } { e: 'close',hadError: false } // Client { e: 'connect' } { e: 'end' } { e: 'close',hadError: false } destroy作为参数关闭客户端套接字,它将变为:

Error

简而言之,我需要服务器知道// Server { e: 'end' } { e: 'close',hadError: false } // Client { e: 'connect' } { e: 'error',err: <Error> } { e: 'close',hadError: true } hadError或发出true事件。尽管我要以某种定义的格式发送最后一段数据以将其解析并识别为错误,或者解决error和FIN数据包方面的问题,但是实现这些并非易事。我想念什么吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)