如何有效地发送大数据包/合并较小的数据包?

2024-01-30

我有一个更大的缓冲区,我试图作为数据包发送。 Nodejs 将缓冲区分割成更小的(65k 数据包)。一旦客户端收到它们,我如何确保数据包组合在一起并有效地将它们重新组合到缓冲区中?

几乎用这个作为测试:

// tcp socket
var buf = Buffer.alloc(265000);
socket.write(buf);

然后在客户端,我需要以某种方式将 65k 数据包组合回缓冲区。

Thanks


TCP 可以自由地将线路上的数据分解成任意大小的数据包。根据不同的实现或物理传输,大小可以不同。您无法确切知道这将如何发生,也不应该具体取决于它是如何实现的。它甚至可能会根据您的数据采用的路径而有所不同。

此外,.on('data', ...)事件只是为您提供到目前为止已到达的所有数据。虽然数据包的顺序得到保证,但不能保证如果您写入一组特定的字节,它们都会以相同的方式到达data事件。它们可以被分解成更小的碎片,并且可能以更小的碎片形式到达。当 TCP 之上没有真正的协议时,这就是 TCP 较低级别上发生的情况。

因此,如果您通过 TCP 发送大量数据,则必须发明自己的协议才能知道何时获得完整的数据集。有多种不同的方案可以实现此目的。

  1. 分隔符。实际数据中不会出现的某种分隔符,表示一组数据的结尾。您读取并解析数据,直到获得分隔符,然后您就知道您拥有可以处理的完整数据集。 HTTP 协议使用换行符作为分隔符。有时使用零字节作为分隔符。

  2. 先发送长度。对于二进制数据,通常首先发送数据的长度,然后接收者知道他们正在读取多少字节的数据,直到获得完整的数据集。

  3. 现有协议。像 webSocket 协议这样的东西可以让你发送任意大小的消息,它会自动将它们包装成包含长度信息的数据包,以便它们可以自动为你重新组合成原始数据集,而无需你自己执行此操作。还有数千种其他协议,其中一种可能非常适合您的需求,您可以只使用现有的实现,而无需编写自己的实现。

你有某种机制知道你何时收到一组完整的数据,然后你可以设置你的data事件处理程序读取数据,将其收集到缓冲区并观察数据的结尾(使用您选择的任何机制)。当您看到一组的末尾时,您可以将其与可能在其之后到达的任何其他数据分开,然后对其进行处理。


因此,假设您使用零字节作为分隔符,并且您已确保零不能也不会出现在实际数据中。然后,你会设置一个data像这样的处理程序:

let accumulatedData = Buffer.alloc(0);
socket.on('data', data => {
    // check for delimiter character
    let offset = data.indexOf(0);
    if (offset !== -1) {
        // get the whole message into one Buffer
        let msg = Buffer.concat(accumulatedData, data.slice(0, offset));

        // put rest of data into the accumulatedData buffer as part of next piece of data
        // skip past the delimiter
        accumulatedData = data.slice(offset + 1);

        // emit that we now have a whole msg
        socket.emit('_msg', msg);

    } else {
        // no delimiter yet, just accumulate the data
        accumulatedData = Buffer.concat(accumulatedData, data);
    }
});

// if any accumulated data still here at end of socket
// notify about it
// this is optional as it may be a partial piece of data (no delimiter)
socket.on('end', () => {
   if (accumulatedData.length) {
       socket.emit('_msg', accumulatedData);
   }
});

// this is my own event which is emitted when a whole message is available
// for processing
socket.on('_msg', msg => {
   // code here to process whole msg
});

注意:此实现删除了消息末尾的分隔符

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何有效地发送大数据包/合并较小的数据包? 的相关文章

  • 无法读取未定义的属性“isLoggedIn”

    此代码用于添加产品 然后添加到购物车和订单 并在后端使用 mongodb 创建 pdf 实际上 session isLoggedIn 是在 auth js 中定义的 检查该代码 但仍在 app js 中它给出了此错误 应用程序 JS代码 c
  • Node.js:如何将流读入缓冲区?

    我编写了一个非常简单的函数 从给定的 URL 下载图像 调整其大小并上传到 S3 使用 gm 和 knox 我不知道我是否正确地将流读取到缓冲区 一切正常 但这是正确的方法吗 另外 我想了解有关事件循环的一些信息 我如何知道函数的一次调用不
  • 具有匹配模式的 ioredis 密钥

    我想用键匹配模式 LOGIN 搜索 Redis 数据库 我在我的应用程序中使用 ioredis 昨天我搜索了整个网络 我得到了一些执行这项工作的选项 如下所示 KEYS 扫描流 Issue import Redis from ioredis
  • 将文件从 url 上传到 s3 存储桶

    我有一个在 Heroku 中运行的 Nodejs 程序 它为我提供了文件的 URL 这些文件需要存储在 s3 存储桶中 据我了解 无法将文件从 url 直接上传到 s3 存储桶 您建议我如何将文件从 URL 获取到 s3 存储桶 我见过有关
  • 我怎样才能摆脱错误:无法在 Heroku 上找到模块“模型”

    我在 Heroku 上不断收到此错误 错误 找不到模块 模型 我正在使用 Node JS 我在用着这个 Node JS 项目 https github com gravityonmars nodejs starter 我从 Heroku 复
  • express.io VS express + socket.io 有什么用处?

    我在这里发现了 socket io 和聊天示例 https github com rauchg chat example blob master index js https github com rauchg chat example b
  • 为什么我从 findAll Sequelize 得到未定义的电子邮件数据结果?

    请帮忙 如何显示来自 Sequelize findAll 查询的电子邮件 因为我从源代码中得到 Undefine 有人可以帮助我吗 这是我的代码 testdata get req res gt User findAll then data
  • Express/node.js 204 HTTP 代码响应问题

    这是我的代码 put function req res User findById req params user id function err user if err return res send err user dateEdite
  • 如何在 package.json 中对嵌套子模块和 TypeScript 使用“导出”?

    我想利用新的优势 出口 https nodejs org api packages html packages exportsNode js 的功能package json这样我就可以执行以下操作 exports dist index js
  • 将 html2pdf 生成的 pdf 发送回服务器

    我必须使用以下命令发送客户端生成的 PDFhtml2pdf到服务器 我已成功将生成的 PDF 转换为 base64 并希望使用axios 这是我的客户端代码 function myFunction var element document
  • Nodejs - 处理和发送多部分请求,

    我的应用程序在 Nodejs 服务器上运行 Node Js 还充当来自应用程序的请求的中间件 代理 因此 从浏览器开始 所有 REST 调用都会转到 NodeJs 然后转到 Java API 我发现处理多部分表单数据的请求时出现问题 我在
  • 节点:使用 Nodemailer 的直通流

    我正在使用officegen 生成一个Word 文档 然后计划使用Nodemailer 和Sendgrid 将其附加到电子邮件中 Officegen 输出一个流 但我更愿意将其直接传递到附件 而不是在本地保存 Word 文档然后附加它 Ge
  • Mongodb更新很多

    我正在使用express js 和 npm 模块 mongodb 进行开发 并以 mongodb 作为数据库 我有两个集合 即 用户 和 活动 一个用户可能有数千个活动 首先 我将用户的 id 姓名和图片 url 存储到 关系的活动文件 请
  • socket.io 作为客户端

    有什么方法可以将socketio作为客户端运行 不是浏览器 而是nodejs脚本 我需要将数据从服务器广播到一些客户端 浏览器 和另一台linux机器 仅运行nodejs来获取变量 没有浏览器 欢迎任何想法 Regards github上有
  • 如何在nodejs缓冲区中存储整数?

    节点jsBuffer http nodejs org docs v0 4 12 api buffers html是相当膨胀 然而 它似乎适合存储字符串 构造函数采用字符串 字节数组或要分配的字节大小 我使用的是 Node js 0 4 12
  • 重写规则,以便正确加载具有绝对路径的 css 和 js 文件

    我花了两个小时 但我无法弄清楚 我不知道如何谷歌解决方案 这是我在 htaccess 文件中的重写规则 RewriteCond REQUEST URI blog RewriteRule blog http localhost 2368 1
  • npm install 命令下载所需包的源位置是什么?

    我试图获取命令 npm install 尝试连接的源位置 URL 并根据 package json 文件获取要下载的依赖包 并将其放置在本地框中 从下面提到的网址 http www tutorialspoint com nodejs nod
  • 如何清除NPM的https代理设置?

    如何清除NPM之前的ssl代理设置 好吧 我搜索了很多 但我得到的所有帖子主要是关于如何set公司网络中的代理 我尝试将代理设置为空 npm config set http proxy npm config set https proxy
  • 为 Node.js 客户端应用程序保留 Firebase 用户

    我正在使用 Firebase 构建 Node js 命令行界面 CLI 用于与后端进行身份验证 我想避免让用户每次运行命令时都输入密码 相反 我想实现一个 登录 流程 将凭证保留到文件系统 该凭证可用于后续的无密码身份验证 直到用户 注销
  • Node.js 中的异步或步骤

    我无法让我的异步代码与 node js 一起使用 尝试异步和步骤库 代码仅返回第一个函数 似乎没有执行其余函数 我究竟做错了什么 thanks var step require step step function f1 console l

随机推荐

  • Safari xhr (AJAX) 跨域重定向请求失败

    如何重现问题 使用 Safari 向服务器发出 AJAX 请求 让服务器响应 302 到不同的域 如果这些条件之一是not遇见了 就可以了 使用不同的浏览器 它可以工作 让服务器重定向到同一域 它可以工作 Load function in
  • 如何在 Maven 中关闭 findbugs“冗余空检查”?

    我找不到报告 冗余空检查 RCN REDUNDANT NULLCHECK OF NONNULL VALUE 的检测器的名称 有人知道它是什么吗 谷歌搜索只给了我大量的项目报告 自从我使用 JetBrains 以来 我遇到了很多错误 NotN
  • Objective-C:声明私有变量的不同方式。他们之间有什么区别吗?

    我想到了声明私有变量的不同方法 我想知道它们之间是否有任何差异 第一种方式 In h file interface DataExtract NSObject private double test 第二种方式 In m file test
  • 我应该使用 WebMatrix 构建一个真实的网站吗?

    我已经阅读了数百篇文章和博客文章 这些文章和博客文章都说 WebMatrix 只适合初学者等 我的问题是 为什么我不应该使用 WebMatrix 创建一个真实的工作网站 比如一个轻量级的问答网站 使用此工具 我们可以创建网站所需的任何内容
  • 使用 lxml 向现有元素添加属性、删除元素等

    我使用以下方法解析 XML from lxml import etree tree etree parse test xml etree XMLParser 现在我想处理已解析的 XML 我在删除具有命名空间的元素或仅删除一般元素时遇到问题
  • ConcurrentHashMap 有什么缺点吗?

    我需要一个可从多个线程访问的 HashMap 有两个简单的选项 使用普通的 HashMap 并在其上同步 或者使用 ConcurrentHashMap 由于 ConcurrentHashMap 不会阻止读取操作 因此它似乎更适合我的需求 几
  • 使用 jQuery get(0) 索引暂停和播放多个 HTML5 视频?

    我有一个包含多个视频的页面 人们可以单击缩略图来播放每个视频 问题是 对于超过 2 个视频 单击第三个缩略图不会暂停第二个视频 因此我会同时播放 2 个视频 我也在使用fadeOut 切换每个视频的可见性 无论视频数量多少 这都可以正常工作
  • Postman 的 Chrome 拦截器是否仍可与 Postman 的独立版本一起使用?

    我之前使用过 Postman Chrome 的扩展以及邮递员拦截器扩展 https chrome google com webstore detail postman interceptor aicmkgpgakddgnaphhhpliif
  • python 中的降噪算法不起作用

    我一直在尝试使用noisereduce pypi 算法来减少音频文件的噪音 但它给了我一个错误 Traceback most recent call last File C Users Seif Koretum Desktop noise
  • 谁在 BPF 中创建地图

    看完之后man bpf以及其他一些文档来源 我的印象是map只能由用户进程创建 然而下面这个小程序似乎神奇地 create bpf map struct bpf map def SEC maps my map type BPF MAP TY
  • Docker compose 运行yarn install

    运行该步骤时运行纱线安装在 docker compose build 命令期间的 Dockerfile 中 我得到 1 4 正在解析包 2 4 正在获取包 信息 电子邮件受保护 cdn cgi l email protection 平台 l
  • 在终端中使用 cURL 发布数组

    我正在尝试为应用程序构建网络服务 因此数据存储在我拥有的在线数据库中 我目前正在构建 php 文档 我很好奇如何才能POST an array using cURL in the 终端 Mac 应用程序 您会看到 应用程序将向 Web 服务
  • Firestore - 按降序排序

    在我的 Firestore 数据库中 我有字段索引 no 数据类型是字符串 但数据是数字 如 1 2 3 等 collectionReference orderBy indexNo Query Direction DESCENDING 到9
  • OpenSSL 作为 CA,无需触及 certs/crl/index/etc 环境

    我认为我有正确的 OpenSSL 命令来签署证书 但我陷入了困境 并且我发现的教程使用了不同的参数格式 我使用的是 OpenSSL 0 9 8o 01 Jun 2010 openssl ca cert cert pem keyfile ke
  • Azure DocumentDB 性能缓慢

    我目前面临 Azure DocumentDB 的响应时间相当慢 第一次尝试 集合中有 31 个对象 我将获取这些对象并将其返回给调用者 我正在使用的代码是这样的 public async Task
  • Clojure 中的原子文件替换

    我有一个可以写入更新磁盘文件的应用程序 但我想尽可能确保文件的先前版本不会损坏 当然 更新文件最直接的方法就是简单地编写 spit myfile txt mystring 但是 如果 PC 或 java 进程 在写入过程中死机 则有很小的机
  • 检索 HTML 元素的位置 (X,Y)

    我想知道如何获取 HTML 元素的 X 和 Y 位置 例如img and div在 JavaScript 中 正确的方法是使用element getBoundingClientRect https developer mozilla org
  • 无法在多线程的正确文件上写入日志?

    我已发布问题 如何使用java在多线程中使用log4j https stackoverflow com questions 8226615 how to use log4j in multithread using java 我得到了回复
  • 避免在 JavaScript 中转义特殊字符

    我的服务器返回值为support testing 当我在客户端获得这个值时 它可以被转义为support testing t作为制表符空格转义 如何避免在 JavaScript 中转义特殊字符 您的服务器需要使用正确的转义来输出字符串 在这
  • 如何有效地发送大数据包/合并较小的数据包?

    我有一个更大的缓冲区 我试图作为数据包发送 Nodejs 将缓冲区分割成更小的 65k 数据包 一旦客户端收到它们 我如何确保数据包组合在一起并有效地将它们重新组合到缓冲区中 几乎用这个作为测试 tcp socket var buf Buf