Есть несколько ошибок, которые вызывают проблему.
Прежде всего, в коде отправителя вы используете ObjectOutputStream
, который, как следует из названия, сделан для отправки объектов,Вместо этого вам нужен DataOutputStream
, который предназначен для примитивных типов данных.Это также намного быстрее, чем ObjectOutputStream
, так как приходится обрабатывать меньше ситуаций.
Итак, первое изменение будет примерно таким:
DataOutputStream oos= new DataOutputStream(client.getOutputStream());
oos.write(buffer);
Следующая проблема на стороне получателя,Событие socket.on('data')
происходит много раз во время передачи, даже если мы получаем одну и ту же строку!Это означает, что вам придется ждать окончания передачи, прежде чем декодировать из base64 в необработанные данные.Другая ошибка, которую вы допустили, - не инициализировать переменную imageData
при ее создании.
Давайте посмотрим код, чтобы сделать все более понятным.Прежде всего, объявим 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
, когда у нас есть вся строка.
Я пробовал это, и теперь оно работает нормально.