- NodeJs的介绍及使用
- Node.js核心模块概览
- NodeJs-Assertion Testing
- NodeJs-Asynchronous Context Tracking
- NodeJs-async_hooks
- NodeJs-Buffer
- Node.js- C++ Addons
- Node.js-C++ Addons Node-API
- NodeJs-C++ Embedder API
- Node.js-Child Process
- NodeJs-Cluster
- Node.js-命令行选项
- Node.js-Console
- Node.js-Corepack
- Node.js-Crypto
- NodeJs-Debugger
- NodeJs-Diagnostics Channel
- NodeJs-DNS
- NodeJs-Domain
- NodeJs-Errors
- NodeJs-Events
- NodeJs-File system(一)
- NodeJs-File system(二)
- NodeJs-File system(三)
- NodeJs-Globals
- NodeJs-HTTP
- NodeJs-HTTP/2
- NodeJs-HTTPS
- NodeJs-Inspector
- NodeJs-Internationalization
- NodeJs-Modules CommonJS modules、ECMAScript modules、node:module、Packages、TypeScript
- NodeJs-Net
- NodeJs-OS
- NodeJs-path
- NodeJs-Performance Hooks
- NodeJs-Permissions
- NodeJs-process
- NodeJs-punycode
- Node.js-querystring
- NodeJs-Readline
- NodeJs-REPL
- NodeJs-Report
- NodeJs-Single Executable Applications
- NodeJs-SQLite
- NodeJs-Stream
- NodeJs-String Decoder
- NodeJs-Test runner
- NodeJs-Timers
- NodeJs-TLS/SSL
- NodeJs-Trace events
- NodeJs-TTY
- NodeJs-UDP/datagram
- NodeJs-URL
- NodeJs-Utilities
- NodeJs-V8
- NodeJs-VM
- NodeJs-WASI
- NodeJs-Web Crypto API
- NodeJs Web Streams API
- NodeJs Worker threads
- NodeJs-Zlib
- NodeJs-Single Executable Applications
NodeJs-Net
class NetNode.js 的 net
模块用于创建低层次的 TCP 或 IPC 服务器和客户端,它为 Node.js 应用提供了与操作系统网络相关的功能,可以用来处理原始套接字通信。本文将详细介绍 net
模块的所有属性、方法以及使用方式,并涵盖它的相关功能。
1. 模块引入
net
模块是 Node.js 的内置模块,因此无需安装任何额外的库,只需通过 require('net')
来引入即可。
const net = require('net');
2. TCP 服务器
2.1 net.createServer()
net.createServer()
用于创建一个 TCP 服务器对象。它接收一个回调函数,当新的连接到达时,该回调函数将被调用,并传递一个 socket
对象,代表与客户端之间的连接。
const server = net.createServer((socket) => {
console.log('客户端连接');
// 处理来自客户端的数据
socket.on('data', (data) => {
console.log(`客户端发送的数据: ${data}`);
});
// 处理客户端断开连接
socket.on('end', () => {
console.log('客户端断开连接');
});
// 向客户端发送数据
socket.write('欢迎连接到服务器!\n');
});
2.2 server.listen()
server.listen()
启动服务器监听指定的端口和主机名。可以使用 server.listen()
来启动服务器,并开始接受连接。
server.listen(8080, '127.0.0.1', () => {
console.log('服务器已启动,正在监听 127.0.0.1:8080');
});
也可以仅传递端口号,默认监听所有可用的网络接口。
server.listen(8080, () => {
console.log('服务器正在监听端口 8080');
});
2.3 server.close()
server.close()
关闭服务器,停止接受新连接,并等待现有连接结束。
server.close(() => {
console.log('服务器已关闭');
});
2.4 事件:connection
, close
, error
connection
: 每当有新客户端连接时触发。close
: 当服务器关闭时触发。error
: 当发生错误时触发。
server.on('connection', (socket) => {
console.log('新连接到达');
});
server.on('error', (err) => {
console.error('服务器发生错误:', err);
});
3. TCP 客户端
3.1 net.connect()
net.connect()
(或 net.createConnection()
)用于创建 TCP 客户端,并连接到指定的服务器。
const client = net.connect({ port: 8080, host: '127.0.0.1' }, () => {
console.log('已连接到服务器');
client.write('你好,服务器!');
});
3.2 client.write()
client.write()
用于向服务器发送数据。可以通过该方法发送字符串或缓冲区数据。
client.write('发送一些数据到服务器');
3.3 client.end()
client.end()
用于关闭与服务器的连接。可以在发送最后一条消息后调用 end()
,告诉服务器不再发送任何数据。
client.end('再见,服务器');
3.4 事件:data
, end
, error
data
: 每当接收到服务器的数据时触发。end
: 当服务器关闭连接时触发。error
: 当连接发生错误时触发。
client.on('data', (data) => {
console.log(`接收到服务器数据: ${data}`);
});
client.on('end', () => {
console.log('已断开与服务器的连接');
});
client.on('error', (err) => {
console.error('发生错误:', err);
});
4. 套接字对象
net.Socket
对象表示与远程主机的 TCP 连接,既可用于客户端,也可用于服务器端的连接。
4.1 socket.write()
socket.write()
用于通过套接字发送数据。可以发送字符串或缓冲区数据。
socket.write('发送数据到客户端或服务器');
4.2 socket.end()
socket.end()
用于关闭套接字。可以在发送完所有数据后调用此方法。
socket.end('关闭连接并发送最后一条消息');
4.3 socket.setTimeout()
socket.setTimeout()
用于设置超时时间(以毫秒为单位)。如果在超时期间没有活动,套接字将触发 timeout
事件。
socket.setTimeout(5000); // 5 秒后触发 timeout
socket.on('timeout', () => {
console.log('连接超时');
socket.end();
});
4.4 事件:data
, end
, timeout
data
: 每当接收到数据时触发。end
: 当连接结束时触发。timeout
: 当连接超时时触发。
socket.on('data', (data) => {
console.log(`收到的数据: ${data}`);
});
socket.on('end', () => {
console.log('连接已关闭');
});
socket.on('timeout', () => {
console.log('连接超时');
});
5. IPC 通信
Node.js 的 net
模块支持 IPC (Inter-Process Communication,进程间通信),可以通过 UNIX 套接字或 Windows 命名管道进行进程间通信。
5.1 net.createServer()
和 net.connect()
用于 IPC
创建 IPC 服务器时,使用文件路径(UNIX)或命名管道(Windows)作为地址。
// 服务器端
const server = net.createServer((socket) => {
console.log('IPC 客户端连接');
socket.write('欢迎到 IPC 服务器');
});
server.listen('/tmp/echo.sock'); // 在 UNIX 系统中
客户端连接到相同的路径:
// 客户端
const client = net.connect('/tmp/echo.sock', () => {
console.log('已连接到 IPC 服务器');
client.write('你好,IPC 服务器');
});
6. 错误处理和最佳实践
在使用 net
模块时,错误处理至关重要。确保在服务器和客户端中都添加对 error
事件的处理程序,防止未处理的异常导致应用崩溃。
server.on('error', (err) => {
console.error('服务器发生错误:', err);
});
client.on('error', (err) => {
console.error('客户端发生错误:', err);
});
连接恢复机制
对于客户端而言,连接到服务器失败时,可以实现重试逻辑。
function connectToServer() {
const client = net.connect({ port: 8080 }, () => {
console.log('已连接到服务器');
});
client.on('error', (err) => {
console.error('连接失败,重试中...', err);
setTimeout(connectToServer, 5000); // 5 秒后重试
});
}
connectToServer();
7. 示例代码
TCP 服务器和客户端
服务器端
const net = require('net');
const server = net.createServer((socket) => {
console.log('新客户端连接');
socket.on('data', (data) => {
console.log(`客户端发送的数据: ${data}`);
socket.write('已收到');
});
socket.on('end', () => {
console.log('客户端断开连接');
});
socket.write('欢迎连接到服务器!\n');
});
server.listen(8080, () => {
console.log('服务器正在监听端口 8080');
});
客户端
const net = require('net');
const client = net.connect({ port: 8080 }, () => {
console.log('已连接到服务器');
client.write('你好,服务器!');
});
client.on('data', (data) => {
console.log(`接收到的数据: ${data}`);
client.end();
});
client.on('end', () => {
console.log('已断开与服务器的连接');
});
8. 总结
net
模块是 Node.js 中用于处理 TCP 或 IPC 连接的强大工具。它提供了服务器和客户端之间的低层网络通信能力,适合处理实时数据传输、聊天室应用、流式数据传输等任务。通过结合事件驱动机制和套接字对象,开发者可以轻松构建高效的网络应用。