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

怎么回事?


3 回复

Node.js Socket Errors: “write after end” 和 “This socket has been ended by the other party”

在使用 Node.js 的 netsocket.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 endError: 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 endThis socket has been ended by the other party 错误。

回到顶部