使用 Node.js 和 WebSocket 传输二进制文件

2023-11-23

我已经在谷歌上搜索这个并在 stackoverflow 上搜索了一段时间,但还没有找到解决方案 - 因此发表了这篇文章。

出于好奇,我正在尝试使用 Node.js 和 WebSockets。我正在尝试将一些二进制数据(mp3)传输到客户端。到目前为止,我的代码如下,但显然没有按预期工作。

我怀疑我的问题是我实际上并没有从服务器发送二进制数据,并且需要一些澄清/帮助。

这是我的服务器...

var fs = require('fs');
var WebSocketServer = require('ws').Server;

var wss = new WebSocketServer({port: 8080,host:"127.0.0.1"});
wss.on('connection', function(ws) {    
    var readStream = 
    fs.createReadStream("test.mp3", 
     {'flags': 'r',
      'encoding': 'binary', 
      'mode': 0666, 
      'bufferSize': 64 * 1024});

    readStream.on('data', function(data) {
        ws.send(data, {binary: true, mask: false});
    });
});

还有我的客户...

context = new webkitAudioContext();
var ws = new WebSocket("ws://localhost:8080");
ws.binaryType = 'arraybuffer';

ws.onmessage = function (evt) {
    context.decodeAudioData(
    evt.data,
        function(buffer) {
            console.log("Success");
        }, 
        function(error) {
            console.log("Error");
        });
};

对解码的调用始终以错误回调结束。我假设这是因为它收到了错误的数据。

所以我的问题是如何正确地将文件传输为二进制文件?

Thanks


您的服务器所做的是将包含 64 KB 块的二进制音频数据的消息发送到您的客户端。您的客户应该在调用之前重建音频文件decodeAudioData.

你正在呼唤decodeAudioData每次你的客户端在 websocket 上收到消息时。您必须创建一个单独的缓冲区来将所有块添加到其中。然后在传输完成后,应向缓冲区提供输入decodeAudioData.

您现在有两个选择:

  1. 您可以在不使用流事件的情况下加载整个文件(fs.read)并使用 ws.send 发送整个文件(很容易做到)
  2. 您使用流事件,修改客户端以接受数据块并在调用之前组装它们decodeAudioData
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Node.js 和 WebSocket 传输二进制文件 的相关文章

随机推荐

  • finally 不在 .NET try-finally 块中执行时的条件

    基本上我听说某些条件会导致 NET 超越finally堵塞 有谁知道这些条件是什么 两种可能性 堆栈溢出异常 执行引擎异常 当有一个finally块时 不会执行StackOverflowException因为堆栈上没有空间来执行更多代码 当
  • 解决方案内的 Visual Studio 项目参考

    在解决方案中引用项目的最佳方式是什么 我通过添加引用 gt 项目添加了引用 然而 它链接到发布 DLL 或调试 DLL 我想在引用中包含项目本身 当我们编译项目时 必须编译所有引用项目 通过依赖项 这个怎么做 如果您想要引用项目本身 而不是
  • 使用 HTML 链接 rel 导入 HTML 文档

    我正在尝试使用以下命令将 HTML 文档导入到我的主文档中 但它似乎不起作用 我正在关注这个演示文稿 使用 Chrome 28 并且我已启用这两个标志about flags Enable experimental WebKit featur
  • 使用 css 设置 div 外宽度

    请问有没有办法设置outerwidth of a div using css忽略填充和边框 当我设置一个div to be 50 宽度 内边距和边框将添加到宽度中 如果没有的话我该如何解决这个问题javascript or jQuery o
  • 如果每个观测值都有新数据,我如何一次订阅 Angular2 中的多个可观测值并等待?

    我有一个角度组件 它使用 3 个服务 这些服务中的每一个都有一个我可以订阅的观察者 如果观察到的任何变化通过 websockets feathers js 发生 则必须更新组件的视图 我想要doSomethingWithTheNewData
  • 如何更新 SQL 数据库中的值? SQLite/Python

    我创建了一个表 并将数据插入到表中 我想知道如何更新 编辑数据 例如 如果我在表中有多个列 其中一列名为 age 该列的数据为 17 而我现在想用 18 替换 17 我会这样做吗下列的 import sqlite3 as lite impo
  • 为什么日期选择器中的日期显示为最后一天?

    我使用 datepicker c 角材料 这是代码 td div class input group div class input group addon div div td
  • centos libgeos 存储库丢失

    在 centos 7 3 上 最小尝试安装 shapely 或 geopandas 需要访问https github com libgeos libgeoslibgeos 尝试通过安装这个sudo yum install libgeos d
  • 没有事件参数的 EventHandler 类型

    当我们想要将数据传递给事件订阅者时 我们使用 EventArgs 或 CustomEventArgs 来实现此目的 Net 提供了一个内置类型 EventHandler 它也使用内置的 EventArgs 类的实例作为参数 当我需要通知订户
  • 将 SimpleMembership 迁移到 Identity 2.0

    这个问题已经演变 所以我更新了标题 这是原来的标题 Identity 2 UserManager Find 抛出 无效的对象名称 dbo ApplicationUser 错误 我正在从 SimpleMembership 转换为 Identi
  • JasperReport 报告中的 Excel 单元格格式

    我正在研究生成 Excel 文件的 JasperReport 报告 由于某种原因 我的单元格格式 类型不正确 例如 我的单元格中有 Date 对象 但是当我生成 Excel 文件时 它将单元格类型设置为数字 或者长整型是单元格中的文本 但单
  • “RxSwift”倒计时器

    我需要一个三十秒计时器RxSwift 这是一个重复的问题 但问题没有明确的答案 现有答案的更好方法 let countDown 15 15 seconds Observable
  • C++ 在派生类中初始化基类的 const int?

    我的基类中有一个常量 int 变量 我想在派生类中初始化响应变量 并使用不同的值 作为参数 这可能吗 这就是我所做的 Base h methods implemented in Base cpp in the actual code cla
  • hadoop 块丢失异常

    我收到以下错误 Diagnostics org apache hadoop hdfs BlockMissingException Could not obtain block BP 467931813 10 3 20 155 1514489
  • 请求安装包

    状态 已批准 但存在问题 需要采取进一步行动 我们发现您的应用存在问题 您需要按照如下所述进行检查并采取措施 以便您的应用将来不会受到影响 发现的问题 权限的使用与应用程序的核心目的没有直接关系 我们发现您的应用不符合 REQUEST IN
  • 使用 Kustomize 在 kubernetes 清单中修补列表

    我想修补 覆盖 list in 库伯内特斯体现为定制化 我正在使用 patchStrategicMerge 方法 当我修补不在列表中的参数时 修补会按预期工作 仅替换 patch yaml 中的已寻址参数 其余部分保持不变 当我修补列表时
  • SAX解析——获取文本节点的高效方法

    给定这个 XML 片段
  • JsonNullable 没有与 Jackson 序列化其值

    我正在尝试使用JsonNullable
  • .NET core 将命令行参数从 Program.cs 传递到 Startup.cs

    我正在尝试配置 kestrel 以便当它处于原始模式时它可以在特定端口上运行 然而 要做到这一点 launchsettings json 似乎需要传递命令行参数来执行此操作 因为没有直接选项 并且它始终在端口 5000 上运行 如果您有需要
  • 使用 Node.js 和 WebSocket 传输二进制文件

    我已经在谷歌上搜索这个并在 stackoverflow 上搜索了一段时间 但还没有找到解决方案 因此发表了这篇文章 出于好奇 我正在尝试使用 Node js 和 WebSockets 我正在尝试将一些二进制数据 mp3 传输到客户端 到目前