中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node.Js怎么實現sendfile數據傳輸

發布時間:2022-12-02 09:54:39 來源:億速云 閱讀:115 作者:iii 欄目:開發技術

本篇內容主要講解“Node.Js怎么實現sendfile數據傳輸”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Node.Js怎么實現sendfile數據傳輸”吧!

首先我們看一下sendfile的好處是什么。

  • sendfile() copies data between one file descriptor and another. Because this  copying is done within the kernel, sendfile() is more efficient than the  combination of read(2) and write(2), which would require transferring data to  and from user space.

我們看到sendfile通過把內核完成數據的傳輸,減少了內核和用戶層的數據復制,從而提高了效率。下面我們通過napi寫一個addon來實現這個功能。

#include <sys/sendfile.h>  #include <stdio.h>  #include <unistd.h> #include <fcntl.h> #include <node_api.h> static napi_value copyFile(napi_env env, napi_callback_info info) {   size_t argc = 3;   napi_value args[3];   // 拿到js層的入參,這里是三個   napi_get_cb_info(env, info, &argc, args, NULL, NULL);   int fd1;   int fd2;   int len;   // js傳入的是一個數字,v8轉成了對象,這里再次把入參轉成int型   napi_get_value_int32(env, args[0], &fd1);   napi_get_value_int32(env, args[1], &fd2);   napi_get_value_int32(env, args[2], &len);   int writed = sendfile(fd2, fd1, 0,len);   napi_value ret;   napi_create_int32(env, writed, &ret);   return ret; }  napi_value Init(napi_env env, napi_value exports) {   napi_value func;   // 創建一個函數并且設置為exports對象的getArray屬性的值   napi_create_function(env,                       NULL,                       NAPI_AUTO_LENGTH,                       copyFile,                       NULL,                       &func);   napi_set_named_property(env, exports, "copyFile", func);   return exports; } NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

下面我們看看怎么使用。首先用這個addon來復制文件,類似Node.js的copyyFile

const fs= require('fs'); const { copyFile } = require('./build/Release/sendfile.node'); const {   O_WRONLY,   O_CREAT, } = fs.constants; async function test() {   const [fd1, fd2] = await Promise.all([openFile('1.txt', 'r'), openFile('2.txt', O_WRONLY | O_CREAT)]);   const { size } = await getFileInfo(fd1);   console.log(copyFile(fd1, fd2, size));   fs.close(fd1, () => {});   fs.close(fd2, () => {}); } function openFile(filename, mode) {   return new Promise((resolve, reject) => {     fs.open(filename, mode, (err, fd) => {       if (err) {         reject(err);       } else {         resolve(fd);       }     });   })}  function getFileInfo(fd) {   return new Promise((resolve, reject) => {     fs.fstat(fd, (err, stat) => {       if (err) {         reject(err)       }else {         resolve(stat);       }     });   }) } test();

執行上面代碼,我們可以看到文件會成功復制2.txt。接著我們再來試一下網絡IO的場景。

const fs= require('fs'); const http = require('http'); const { copyFile } = require('./build/Release/sendfile.node'); const server = http.createServer(async (req, res) => {   const fd = await openFile('1.txt', 'r');   const { size } = await getFileInfo(fd);   const ret = copyFile(fd, res.socket._handle.fd, size);   res.socket.end(); }).listen(8002);  const {   O_WRONLY,   O_CREAT, } = fs.constants;  function openFile(filename, mode) {   return new Promise((resolve, reject) => {     fs.open(filename, mode, (err, fd) => {       if (err) {         reject(err);       } else {         resolve(fd);       }     });   })}  function getFileInfo(fd) {   return new Promise((resolve, reject) => {     fs.fstat(fd, (err, stat) => {       if (err) {         reject(err)       }else {         resolve(stat);       }     });   })}

以上代碼首先啟動一個http服務器,然后收到請求的時候,通過addon調用sendfile給前端返回對應的內容,最后關閉連接。結果如下。

Node.Js怎么實現sendfile數據傳輸

到此,相信大家對“Node.Js怎么實現sendfile數據傳輸”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武夷山市| 屏山县| 长宁县| 遂平县| 沽源县| 辽中县| 丹江口市| 固原市| 景洪市| 华坪县| 曲阜市| 榆林市| 常德市| 双鸭山市| 鄂托克旗| 舒兰市| 绥棱县| 青田县| 神农架林区| 苏州市| 达拉特旗| 中阳县| 明溪县| 商城县| 沙洋县| 荆门市| 海南省| 富民县| 永川市| 肃南| 察雅县| 林周县| 崇明县| 丹寨县| 民县| 临泽县| 象州县| 满城县| 赤壁市| 西和县| 红桥区|