2 回答
TA贡献1752条经验 获得超4个赞
有几个错误导致了问题。
首先,在您的发件人代码中,您使用的ObjectOutputStream是 ,顾名思义,它用于发送对象。你需要的是DataOutputStream,它是为原始数据类型制作的。它也比ObjectOutputStream因为它必须处理更少的情况快得多。
所以第一个变化将是这样的:
DataOutputStream oos= new DataOutputStream(client.getOutputStream());
oos.write(buffer);
下一个问题是在接收方。socket.on('data')即使我们收到相同的字符串,该事件在传输过程中也会发生多次!这意味着在从 base64 解码为原始数据之前,您必须等待传输完成。您犯的另一个错误是imageData在创建 var 时没有初始化它。
让我们看看代码,让一切更清晰。首先声明imageData:
var imageData = "";
现在我们知道它肯定是一个空字符串。接下来,接收数据:
socket.on('data',function(data){
imageData += data;
});
正如你所看到的,我不再在这里解码数据,因为它必须在收到所有内容后才能完成。最后一件事,解码:
socket.on('end',function(){
console.log(imageData.length)
var decoded = Buffer.from(imageData, 'base64');
fs.writeFileSync(new Date()+".png", decoded, function (err) {
if (err) throw err;
else console.log('Saved!');
});
});
现在解码是在end事件期间完成的,当我们拥有整个字符串时。
我已经试过了,现在工作正常。
TA贡献1811条经验 获得超6个赞
我认为您是在 java 客户端中将图像数据转换为 base64,然后在 server.js 中再次将 base64 字符串转换为 base64。
socket.on('data',function(data){
let imageData=Buffer.from(data, 'base64');
fs.writeFileSync(new Date()+".png", imageData, function (err) {
if (err) throw err;
else console.log('Saved!');
});
});
添加回答
举报