我的BinaryJS webclient接收二进制数据,如何将其转换回服务器发送的文本输入?
创建Websocket的服务器(带有NodeJS)使用BinaryJS,因为它获取要作为流传输的数据,我想使用Websocket流将该数据转发到客户端。
Web客户端看起来如下:
<html>
<head>
<script src="http://cdn.binaryjs.com/0/binary.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.js"></script>
<script src="text-encoding/lib/encoding.js"></script>
<script src="decode.js"></script>
<script>
// Connect to Binary.js server
var client = new BinaryClient('ws://localhost:9000');
// Received new stream from server!
client.on('stream', function(stream, meta){
// Buffer for parts
// Got new data
stream.on('data', function(data){
$( ".inner" ).append(data+"<br />");
});
stream.on('end', function(){
});
});
</script>
</head>
<body>
<div class="inner">Output:</div>
</body>
</html>
可悲的是,我的输出不是输入文本,只是这样:
[object ArrayBuffer]
编辑: 找到了一个可能的解决方案:
由于数据是UTF-8编码的,我可以使用某人在另一个问题中发布的函数对其进行解码:
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
答案 0 :(得分:1)
这里有两种情况:
我假设您指的是这个问题:Uint8Array to string in Javascript
请注意,那里的fromCharCode
答案明确表示它不能正确解码UTF8。最好的办法是使用FileReader解码ArrayBuffer。您也错误地在data
处理程序中处理此内容,而不应该首先将其聚合。
client.on('stream', function(stream, meta){
var parts = [];
stream.on('data', function(data){
parts.push(data);
});
stream.on('end', function(){
var blob = new Blob(parts);
var reader = new FileReader();
reader.onload = function(){
$( ".inner" ).append(reader.result + "<br />");
};
reader.readAsText(blob);
});
});
现在说,我的实际建议是你不要在这种情况下使用Binary.js
。它的全部意义在于传输二进制数据。如果您计划主要传输文本,则应考虑使用更多面向文本的库,如Socket.IO。