如何解决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 举报,一经查实,本站将立刻删除。