推荐答案
Socket.IO 支持二进制数据的传输,可以通过以下方式实现:
- Blob 和 ArrayBuffer:Socket.IO 可以直接发送
Blob或ArrayBuffer类型的二进制数据。 - Base64 编码:如果客户端或服务器不支持直接传输二进制数据,Socket.IO 会自动将二进制数据转换为 Base64 编码的字符串进行传输。
- 流式传输:对于大文件或大量数据,Socket.IO 支持分块传输,避免一次性传输大量数据导致的内存问题。
本题详细解读
1. Blob 和 ArrayBuffer 传输
Socket.IO 可以直接处理 Blob 和 ArrayBuffer 类型的二进制数据。例如,客户端可以通过以下代码发送二进制数据:
const blob = new Blob(['Hello, World!'], { type: 'text/plain' });
socket.emit('binaryData', blob);服务器端可以这样接收:
socket.on('binaryData', (data) => {
console.log(data); // 这里 data 是一个 Blob 对象
});2. Base64 编码
如果客户端或服务器不支持直接传输二进制数据,Socket.IO 会自动将二进制数据转换为 Base64 编码的字符串。这种方式虽然增加了数据大小,但确保了兼容性。
3. 流式传输
对于大文件或大量数据,Socket.IO 支持分块传输。这种方式可以有效避免一次性传输大量数据导致的内存问题。例如:
const stream = fs.createReadStream('large-file.bin');
stream.on('data', (chunk) => {
socket.emit('binaryChunk', chunk);
});
stream.on('end', () => {
socket.emit('binaryEnd');
});服务器端可以这样接收:
// www.javascriptcn.com code example
let receivedData = Buffer.from([]);
socket.on('binaryChunk', (chunk) => {
receivedData = Buffer.concat([receivedData, chunk]);
});
socket.on('binaryEnd', () => {
console.log('Received all binary data');
// 处理 receivedData
});通过这种方式,Socket.IO 可以高效地处理二进制数据的传输。