Nodejs socket error: Error: write after end Nodejs socket error: Error: This socket has been ended by the other party Nodejs socket error: Error: write after end
Nodejs socket error: Error: write after end
Nodejs socket error: Error: This socket has been ended by the other party
Nodejs socket error: Error: write after end
socket error:Error: write after end socket error:Error: This socket has been ended by the other party socket error:Error: write after end
怎么回事?
Node.js Socket Errors: “write after end” 和 “This socket has been ended by the other party”
在使用 Node.js 的 net
或 socket.io
等模块处理网络通信时,你可能会遇到一些常见的错误,如 "write after end"
和 "This socket has been ended by the other party"
。这些错误通常发生在尝试向已经关闭的连接写入数据时。
1. “write after end” 错误
当一个 socket 已经被关闭后,你还试图向其写入数据,就会抛出 "write after end"
错误。例如:
const net = require('net');
const server = net.createServer((socket) => {
socket.on('end', () => {
console.log('Client disconnected');
// 在这里关闭 socket
socket.end();
});
// 假设我们有一个定时器尝试在 socket 关闭后发送数据
setTimeout(() => {
socket.write('Some data'); // 这里会抛出 "write after end" 错误
}, 5000);
});
server.listen(3000, () => {
console.log('Server is listening on port 3000');
});
2. “This socket has been ended by the other party” 错误
这种错误通常发生在客户端断开连接后,服务器端尝试向该客户端写入数据时。例如:
const net = require('net');
const server = net.createServer((socket) => {
socket.on('data', (data) => {
console.log(`Received: ${data.toString()}`);
// 如果客户端断开连接,尝试继续发送数据会导致此错误
socket.write('Response data');
});
socket.on('end', () => {
console.log('Client disconnected');
});
});
server.listen(3000, () => {
console.log('Server is listening on port 3000');
});
解决方案
为了防止这些错误的发生,你应该确保在写入数据之前检查 socket 是否仍然处于打开状态。可以使用 socket.writable
属性来检查:
if (socket.writable) {
socket.write('Some data');
} else {
console.log('Socket is not writable, cannot send data');
}
通过这种方式,你可以避免在 socket 已经关闭的情况下尝试写入数据,从而避免出现 "write after end"
和 "This socket has been ended by the other party"
错误。
res.end()
之后你还有向res
里面写数据,肯定是不对的
遇到 Error: write after end
和 Error: This socket has been ended by the other party
这类错误通常是因为你在 Socket 已经关闭后尝试写入数据。这可能是由于程序逻辑问题或网络连接中断导致的。
解决方案
确保在尝试写入数据之前,Socket 是打开状态。可以使用事件监听器来管理 Socket 的生命周期。
示例代码
以下是一个简单的 TCP 服务器和客户端示例,展示了如何正确处理 Socket 的生命周期:
TCP 服务器代码
const net = require('net');
const server = net.createServer((socket) => {
console.log("Client connected");
socket.on('end', () => {
console.log("Client disconnected");
});
socket.on('data', (data) => {
console.log(`Received data: ${data}`);
// 确保Socket是打开的再写入数据
if (!socket.destroyed) {
socket.write('Echo: ' + data);
}
});
socket.on('error', (err) => {
console.error(`Socket error: ${err.message}`);
});
});
server.listen(3000, () => {
console.log('Server listening on port 3000');
});
TCP 客户端代码
const net = require('net');
const client = new net.Socket();
client.connect(3000, 'localhost', () => {
console.log('Connected to server');
client.write('Hello, Server!');
});
client.on('data', (data) => {
console.log(`Server says: ${data}`);
});
client.on('close', () => {
console.log('Connection closed');
});
client.on('error', (err) => {
console.error(`Client error: ${err.message}`);
});
注意事项
- 在
data
事件处理函数中检查socket.destroyed
来确保在写入前 Socket 仍然是活动的。 - 使用
error
事件来捕获任何 Socket 相关的错误并进行处理。 - 使用
end
事件来处理客户端断开连接的情况。
这样可以有效避免 write after end
和 This socket has been ended by the other party
错误。