如何通过 Websockets 路由不同的数据类型?
how to route different data types over Websockets?
我必须通过 websocket 服务器发送大量 ArrayBuffers(音频语音数据)。问题是,客户端必须知道传入数据是哪种类型的 ArrayBuffer(Uint8 / Uint16 / Float32 ...)。如果用户切换到其他音频质量,类型可以即时更改。
告知客户数组类型的最佳方式是什么?
目前的想法:
- 向数组添加一个额外的前缀字节(这可能会很慢,因为我必须为每个音频块创建一个新的 arrayBuffer)
- 使用 /16float 或 /uint8 等不同的路由来了解哪些数据即将到来。 (我还没有找到任何关于如何使用 websockets 完成的信息)
有更好的方法吗?谁能给我举个例子 URL-Path routes with websockets 是如何工作的?
编辑:
我实现了前缀字节来发送有关客户端和数组类型的信息,但仍然对 better/other 解决方案感兴趣。
Cracker0dks,你为什么使用纯 websockets 而不是库。使用 primus,您可以使用 substream - 命名空间 - 这或多或少正是您想要的 - 您还可以将二进制解析器与 primus 一起使用。
Socket.io 也是一个选项,但它们不如 primus。(在我看来)
目前最受支持/稳定/完整的 ws 解决方案
// server side:
var primus
, server
, substream
, http
, Uint8
, Uint16
, Float32
;
Primus = require('primus');
http = require('http');
substream = require('substream');
server = http.createServer();
primus = new Primus(server);
primus.use('substream', substream);
server.listen(8000);
primus.on('connection', function (spark) {
Uint8 = spark.substream('Uint8');
Uint16 = spark.substream('Uint16');
Float32 = spark.substream('Float32');
Uint8.on('data', function (data) {
console.log(data); //we recieve data from client on Uint8 ('to server')
});
Uint16.on('data', function (data) {
console.log(data); //we recieve data from client on Uint16 ('to server')
});
Float32.on('data', function (data) {
console.log(data); //we recieve data from client on Float32 ('to server')
});
Uint8.write('to client'); // write data to client to Uint8
Uint16.write('to client'); // write data to client to Uint16
Float32.write('to client'); // write data to client to Float32
//
// piping data to Float32
//
fs.createReadSteam(__dirname + '/example.js').pipe(Float32, {
end: false
});
//
// To stop receiving data, simply end the substream:
//
Uint16.end();
});
// client side:
var primus
, Uint8
, Uint16
, Float32
;
primus = new Primus('server address');
Uint8 = primus.substream('Uint8');
Uint8.write('to server'); // write data to server to Uint8
Uint16 = primus.substream('Uint16');
Uint16.write('to server'); // write data to server to Uint16
Float32 = primus.substream('Float32');
Float32.write('to server'); // write data to server to Float32
Uint8.on('data', function (data) {
console.log(data); // you get data from server to Uint8 ('to client')
});
Uint16.on('data', function (data) {
console.log(data); // you get data from server to Uint8 ('to client')
});
Float32.on('data', function (data) {
console.log(data); // you get data from server to Uint8 ('to client')
});
以上内容摘自他们的文档并进行了更改以适合您的示例 - 我没有测试它但它应该可以工作。
希望对你有所帮助。
我必须通过 websocket 服务器发送大量 ArrayBuffers(音频语音数据)。问题是,客户端必须知道传入数据是哪种类型的 ArrayBuffer(Uint8 / Uint16 / Float32 ...)。如果用户切换到其他音频质量,类型可以即时更改。
告知客户数组类型的最佳方式是什么?
目前的想法:
- 向数组添加一个额外的前缀字节(这可能会很慢,因为我必须为每个音频块创建一个新的 arrayBuffer)
- 使用 /16float 或 /uint8 等不同的路由来了解哪些数据即将到来。 (我还没有找到任何关于如何使用 websockets 完成的信息)
有更好的方法吗?谁能给我举个例子 URL-Path routes with websockets 是如何工作的?
编辑: 我实现了前缀字节来发送有关客户端和数组类型的信息,但仍然对 better/other 解决方案感兴趣。
Cracker0dks,你为什么使用纯 websockets 而不是库。使用 primus,您可以使用 substream - 命名空间 - 这或多或少正是您想要的 - 您还可以将二进制解析器与 primus 一起使用。
Socket.io 也是一个选项,但它们不如 primus。(在我看来)
目前最受支持/稳定/完整的 ws 解决方案
// server side:
var primus
, server
, substream
, http
, Uint8
, Uint16
, Float32
;
Primus = require('primus');
http = require('http');
substream = require('substream');
server = http.createServer();
primus = new Primus(server);
primus.use('substream', substream);
server.listen(8000);
primus.on('connection', function (spark) {
Uint8 = spark.substream('Uint8');
Uint16 = spark.substream('Uint16');
Float32 = spark.substream('Float32');
Uint8.on('data', function (data) {
console.log(data); //we recieve data from client on Uint8 ('to server')
});
Uint16.on('data', function (data) {
console.log(data); //we recieve data from client on Uint16 ('to server')
});
Float32.on('data', function (data) {
console.log(data); //we recieve data from client on Float32 ('to server')
});
Uint8.write('to client'); // write data to client to Uint8
Uint16.write('to client'); // write data to client to Uint16
Float32.write('to client'); // write data to client to Float32
//
// piping data to Float32
//
fs.createReadSteam(__dirname + '/example.js').pipe(Float32, {
end: false
});
//
// To stop receiving data, simply end the substream:
//
Uint16.end();
});
// client side:
var primus
, Uint8
, Uint16
, Float32
;
primus = new Primus('server address');
Uint8 = primus.substream('Uint8');
Uint8.write('to server'); // write data to server to Uint8
Uint16 = primus.substream('Uint16');
Uint16.write('to server'); // write data to server to Uint16
Float32 = primus.substream('Float32');
Float32.write('to server'); // write data to server to Float32
Uint8.on('data', function (data) {
console.log(data); // you get data from server to Uint8 ('to client')
});
Uint16.on('data', function (data) {
console.log(data); // you get data from server to Uint8 ('to client')
});
Float32.on('data', function (data) {
console.log(data); // you get data from server to Uint8 ('to client')
});
以上内容摘自他们的文档并进行了更改以适合您的示例 - 我没有测试它但它应该可以工作。
希望对你有所帮助。