1、net模块介绍
Node.js中的net模块提供了一组用于创建TCP(传输控制协议)或IPC(进程间通信)服务器和客户端的API。net模块以异步的方式工作,这意味着不需要使用线程即可并发地处理多个连接请求。
net模块一般用于创建基于流的TCP或IPC服务器,它可以在服务器端向客户端发送和接收数据,同时也可以在客户端与服务器进行通信。
2、net模块的API
2.1、net.createServer([options][,connectionListener])
该方法用于创建TCP或IPC服务器。传入connectionListener回调函数,该函数在每个客户端连接时被调用。可以使用该函数实例化socket对象,例如在客户端与服务器之间进行通信时使用。
const net = require('net');
const server = net.createServer((socket) => {
// connection callback
socket.end('hello client');
});
server.listen(8080, () => {
console.log('server is listening');
});
上述示例中,我们使用createServer()方法创建一个TCP服务器,该服务器在8080端口上监听连接请求。每次客户端连接到服务器时,服务器会向客户端发送消息并关闭连接。
2.2、net.connect(options[,connectListener])
该方法用于创建TCP或IPC客户端。传入connectListener回调函数,该函数在连接建立时被调用。可以通过socket对象与服务器进行通信。
const net = require('net');
const client = net.connect({ port: 8080 }, () => {
// connection callback
console.log('client is connected');
client.write('hello server');
});
上述示例中,我们使用connect()方法连接到TCP服务器,该服务器在8080端口上监听连接请求。连接被成功建立后,客户端向服务器发送一条消息。
2.3、socket.write(data[,encoding][,callback])
该方法用于向已连接的socket对象发送数据。
const net = require('net');
const server = net.createServer((socket) => {
// connection callback
socket.on('data', (data) => {
console.log(data.toString()); // hello server
socket.write('hi client');
});
});
server.listen(8080, () => {
console.log('server is listening');
});
const client = net.connect({ port: 8080 }, () => {
// connection callback
console.log('client is connected');
client.write('hello server');
});
client.on('data', (data) => {
console.log(data.toString()); // hi client
client.end();
});
上述示例中,客户端向服务器发送消息后,服务器会向客户端回复一条消息,然后关闭连接。客户端在收到服务器的回复后也会关闭连接。
2.4、socket.pipe(destination[,options])
该方法用于将socket对象中的数据流传输到另一个可写流对象destination中。
const net = require('net');
const fs = require('fs');
const server = net.createServer((socket) => {
// connection callback
const stream = fs.createReadStream('file.txt');
stream.pipe(socket);
stream.on('end', () => {
socket.end();
});
});
server.listen(8080, () => {
console.log('server is listening');
});
const client = net.connect({ port: 8080 }, () => {
// connection callback
console.log('client is connected');
client.pipe(process.stdout);
});
上述示例中,服务器将文件中的内容通过socket传输给客户端,客户端将收到的数据流打印到控制台上。
2.5、事件
net模块中常用的事件包括connection、data、end、error和close事件。这些事件可以用于监听不同的操作,并在事件触发时执行回调函数。
const net = require('net');
const server = net.createServer((socket) => {
// connection callback
socket.on('data', (data) => {
console.log(data.toString()); // hello server
socket.write('hi client');
});
socket.on('end', () => {
console.log('socket ended');
});
socket.on('error', (err) => {
console.log(err);
});
socket.on('close', () => {
console.log('socket closed');
});
});
server.listen(8080, () => {
console.log('server is listening');
});
const client = net.connect({ port: 8080 }, () => {
// connection callback
console.log('client is connected');
client.write('hello server');
});
client.on('data', (data) => {
console.log(data.toString()); // hi client
client.end();
});
client.on('end', () => {
console.log('client ended');
});
client.on('error', (err) => {
console.log(err);
});
client.on('close', () => {
console.log('client closed');
});
上述示例中,我们监听了服务器和客户端的connection、data、end、error和close事件,并在事件触发时分别输出对应的消息。当客户端向服务器发送消息后,服务器会向客户端回复一条消息,并在收到客户端的close事件后关闭连接。
3、总结
Node.js中的net模块提供了一组用于创建TCP或IPC服务器和客户端的API。我们可以使用这些API创建基于流的TCP或IPC服务器,并在服务器和客户端之间进行通信。同时,我们也可以使用事件来监听不同的操作,并在事件触发时执行相应的回调函数。