nodejs linux控制io,NodeJS通过stream操作IO

以文件读取为例,在NodeJS中有两种类型的读写文件的方式,一种是通过fs.readFile()和fs.writeFile()方法

fs.readFile()方法的参数,为文件的名字和一个回调函数,其中回调函数接收两个参数:

err:如果读取错误,则返回一个错误对象;

data:如果读取成功,则返回读取后的数据;

fs.writeFile()方法的参数

fileName:要写入的目标文件;

data:要写入的数据;

option:写入的配置参数;

callback:写入成功后的回调函数,接收寄一个参数err,如果写入文件失败,则用err,接收错误对象

示例:

const fs = require('fs')

const path = require('path')

let fileName1 = path.resolve(__dirname, 'data.txt')

let fileName2 = path.resolve(__dirname, 'data_bar_02.txt')

fs.readFile(fileName1, (err, data) => {

if (err) {

console.error(err)

return

}

fs.writeFile(fileName2, data, {

flags: 'a'

}, (err) => {

if (err) {

console.error(err)

return

}

console.log('clone done')

})

})

这里就引出了在服务器端读取文件的问题,由于计算机为单个的NodeJS进程分配的系统资源是有限制的,单个NodeJS服务进程最大被分配的内存为3GB,用上面的这种方式读取和写入文件,是把读取后和要写入的数据整体作为变量,存储在计算机的内存中,如果目标文件体积过大,就会直接完全占用系统资源,造成服务崩溃。所以在NodeJS中,通常使用stream技术,进行IO操作。

通过stream操作IO

在NodeJS中,通过stream技术,读取和写入文件,主要是通过fs.createReadStream()和createWriteStream()方法

// 利用stream操作文件

const fs = require('fs')

const path = require('path')

const fileName1 = path.resolve(__dirname, 'data.txt')

const fileName2 = path.resolve(__dirname,'data_bak.txt')

const readStream = fs.createReadStream(fileName1)

const writeStream = fs.createWriteStream(fileName2)

readStream.pipe(writeStream)

readStream.on('data', (chunk) => {

console.log(chunk.toString())

})

readStream.on('end', () => {

console.log('copy done')

})

使用数据流方式读取操作IO,将文件分段读取并逐步写入目标文件,可以有效降低服务器的系统开销。再看下面的例子:

const http = require('http')

const fs = require('fs')

const path = require('path')

const app = http.createServer((req, res) => {

if (req.method === 'GET') {

let fileName = path.resolve(__dirname, 'data.txt')

let readStream = fs.createReadStream(fileName)

readStream.pipe(res)

}

})

app.listen(8000, () => {

console.log('running on 8000')

})

服务器IO操作的瓶颈,不止有硬件瓶颈,同时还有网络瓶颈,使用数据流的形式来操作文件读取的方式在网络流媒体(在线视频,音乐网站,视频直播,短视频···)等需要对较大文件进行读写操作的场景下,可以有效降低网络负载,并减少用户等待时间,提高用户体验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Socket.IO 是一个基于 Node.js 的实时网络库,它使得在客户端和服务器之间建立实时、双向通信变得容易。它提供了一个 WebSocket 的替代品,允许在不支持 WebSocket 的浏览器中使用轮询、长轮询和其他技术来实现实时通信。 Socket.IO 的 API 很简单,它提供了一个用于在客户端和服务器之间发送事件的消息传递机制。您可以通过监听事件来处理来自客户端和服务器的消息,并使用 emit() 方法向客户端和服务器发送消息。 在 Node.js 中使用 Socket.IO 时,您需要使用 socket.io 模块。您可以使用 npm 安装: ``` npm install socket.io ``` 然后,在您的应用程序中,您可以使用以下代码创建 Socket.IO 服务器: ```javascript const http = require('http'); const server = http.createServer(); const io = require('socket.io')(server); io.on('connection', (socket) => { console.log('a user connected'); socket.on('disconnect', () => { console.log('user disconnected'); }); }); server.listen(3000, () => { console.log('listening on *:3000'); }); ``` 这个例子创建了一个 HTTP 服务器并使用 Socket.IO 将其升级为实时服务器。当客户端连接时,'connection' 事件被触发。您可以监听此事件并处理来自客户端的消息。 在客户端,您需要使用以下代码来连接到 Socket.IO 服务器: ```javascript <script src="/socket.io/socket.io.js"></script> <script> const socket = io(); socket.on('connect', () => { console.log('connected'); }); socket.on('disconnect', () => { console.log('disconnected'); }); </script> ``` 这个例子使用客户端 Socket.IO 库连接到服务器。当连接成功时,'connect' 事件被触发。您可以监听此事件并开始向服务器发送消息。 在客户端和服务器之间发送消息非常简单。您可以使用 emit() 方法从客户端向服务器发送消息,也可以使用 socket.emit() 方法从服务器向客户端发送消息。例如,在客户端,您可以使用以下代码向服务器发送消息: ```javascript socket.emit('chat message', 'Hello, world!'); ``` 在服务器上,您可以监听 'chat message' 事件并处理来自客户端的消息: ```javascript io.on('connection', (socket) => { socket.on('chat message', (msg) => { console.log('message: ' + msg); }); }); ``` 这个例子监听 'chat message' 事件并打印从客户端发送的消息。 这只是 Socket.IO 的一小部分功能,您可以在官方文档中了解更多:https://socket.io/docs/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值