Nodejs中socket.write和socket.end的使用

Nodejs中socket.write和socket.end的使用

用socket.write发送一个长度为4的数据 每次发送都输出socket.bytesWritten发现每次结果都会递增 第一次发送是4 第二次就是8 但是客户端收到的数据长度确实4

去看了一下API发现了一个end方法,如果每次都用end发送输出的结果每次都是4,有人说 end是强制发送。write是缓冲发送,但是我又在api里发现了end是半关闭socket,但是测试的时候2边确实都能收到消息,有点浓不明白了。希望哪个路过的高手能给指点下

4 回复

Node.js 中 socket.writesocket.end 的使用

在 Node.js 中,socket.writesocket.end 是用于网络通信的重要方法。理解它们的工作原理对于开发高性能、稳定的网络应用至关重要。

socket.write

socket.write 方法用于向套接字(socket)写入数据。它是一个异步操作,不会阻塞程序执行,并且可以接受一个或多个数据块。socket.write 不会立即发送数据,而是将数据放入内部缓冲区中。只有当缓冲区中的数据被发送出去后,才会触发回调函数。

示例代码:

const net = require('net');

// 创建服务器
const server = net.createServer((socket) => {
    console.log('Client connected');

    // 每次发送4字节的数据
    socket.write('test'); // 第一次发送
    socket.write('test'); // 第二次发送

    socket.on('data', (data) => {
        console.log(`Received data: ${data.length} bytes`);
    });

    socket.on('end', () => {
        console.log('Socket end event triggered');
    });
});

server.listen(3000, () => {
    console.log('Server listening on port 3000');
});

在这个例子中,服务器创建了两个 socket.write 调用,每次发送4个字节的数据。尽管客户端接收到的数据长度为4字节,但 socket.bytesWritten 的值会不断增加,因为每次调用 socket.write 都会增加缓冲区的大小。

socket.end

socket.end 方法用于通知服务器或客户端所有数据已经发送完毕。它会关闭套接字的写通道,但并不会立即关闭连接。如果需要完全关闭连接,可以调用 socket.destroy()

示例代码:

const net = require('net');

// 创建客户端
const client = new net.Socket();
client.connect(3000, '127.0.0.1', () => {
    console.log('Connected to server');

    // 发送数据并标记结束
    client.write('Hello');
    client.end('World'); // 结束数据发送
});

client.on('data', (data) => {
    console.log(`Received: ${data}`);
});

client.on('close', () => {
    console.log('Connection closed');
});

在这个例子中,客户端发送了两部分数据,HelloWorld。调用 client.end('World') 会标记数据发送的结束,但并不会立即关闭连接。如果客户端不需要再发送任何数据,可以使用 client.destroy() 来关闭连接。

总结

  • socket.write 用于向套接字写入数据,数据会被放入缓冲区。
  • socket.end 用于通知对方所有数据已经发送完毕,但不会立即关闭连接。
  • 如果需要完全关闭连接,可以使用 socket.destroy()

希望这些示例和解释能够帮助你更好地理解和使用 socket.writesocket.end


高手们。。还没到吃饭的点啊

那问的那位仁兄说的很对,socket.write不管你是写一定数量的数据,甚至是写一个字节,会写所有字节从给定的缓冲区,它是有效的,根据网络缓冲区等,但是这样你必须小心,因为这样你就会无意中忘记发送你其他的数据.而end的时候应该是直接进行强制输出

socket.writesocket.end 是 Node.js 中用于处理网络通信的两个重要方法。socket.write 用于向远端发送数据,而 socket.end 则用于通知远端本端不会再发送更多的数据。

socket.write

  • 用途:将数据写入到套接字中。
  • 行为:默认情况下,socket.write 是非阻塞的,会将数据放入内部缓冲区。只有当数据完全发送出去后,才会触发回调函数(如果提供了的话)。
  • 注意:如果数据量很大或网络状况不佳,可能会导致数据积压在缓冲区中,影响性能或造成数据丢失。

socket.end

  • 用途:通知远端不再发送更多的数据。
  • 行为:调用 socket.end 并不会立即关闭连接,而是告诉远端发送方已经完成所有数据的发送。通常在所有的数据都通过 socket.write 发送完毕之后调用。
  • 注意:调用 socket.end 后,远端仍然可以继续发送数据,直到其也调用 socket.end

示例代码

const net = require('net');

// 创建服务器
const server = net.createServer((socket) => {
    console.log("客户端已连接");

    // 发送数据
    socket.write(Buffer.from([1, 2, 3, 4])); // 发送4个字节的数据
    
    // 通知远端发送完毕
    socket.end();

    socket.on('data', (data) => {
        console.log(`接收到了来自客户端的数据: ${data.length} 字节`);
    });

    socket.on('end', () => {
        console.log('客户端已断开');
    });
});

server.listen(6969, () => {
    console.log('服务器已启动');
});

解释

在这个示例中:

  • 当客户端连接时,服务器会发送一个长度为4的缓冲区数据。
  • 使用 socket.end() 通知客户端不再发送更多数据。
  • 如果服务器需要继续接收客户端的数据,可以在适当的地方添加更多的逻辑来处理数据。

这样,你就能理解为什么 socket.write 会在内部进行缓冲,而 socket.end 用来明确表示数据发送结束。

回到顶部