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边确实都能收到消息,有点浓不明白了。希望哪个路过的高手能给指点下
Node.js 中 socket.write
和 socket.end
的使用
在 Node.js 中,socket.write
和 socket.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');
});
在这个例子中,客户端发送了两部分数据,Hello
和 World
。调用 client.end('World')
会标记数据发送的结束,但并不会立即关闭连接。如果客户端不需要再发送任何数据,可以使用 client.destroy()
来关闭连接。
总结
socket.write
用于向套接字写入数据,数据会被放入缓冲区。socket.end
用于通知对方所有数据已经发送完毕,但不会立即关闭连接。- 如果需要完全关闭连接,可以使用
socket.destroy()
。
希望这些示例和解释能够帮助你更好地理解和使用 socket.write
和 socket.end
。
那问的那位仁兄说的很对,socket.write不管你是写一定数量的数据,甚至是写一个字节,会写所有字节从给定的缓冲区,它是有效的,根据网络缓冲区等,但是这样你必须小心,因为这样你就会无意中忘记发送你其他的数据.而end的时候应该是直接进行强制输出
socket.write
和 socket.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
用来明确表示数据发送结束。