Отправить изображение с клиента Java TCP на сервер TCP Node.js - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь отправить изображение с TCP-клиента java на TCP-сервер Node.js. Я пытался: отправлять двоичные данные, отправлять двоичные данные в кодировке base64, отправлять строки в кодировке utf-8, и на данный момент ничего не работает, явсегда получает данные и создает изображение (используя fs), но оно всегда повреждено.Вот мой код:

КЛИЕНТ JAVA:

import java.util.*;
import java.io.*;
import java.net.Socket;

public class client{

    public static void main(String[] args) throws Exception {
        Socket client = new Socket("localhost",8080);
        Scanner scanner = new Scanner(System.in);
        String path= scanner.nextLine();
        FileInputStream fis = new FileInputStream(path);
        byte[] buffer = new byte[fis.available()];
        fis.read(buffer);
        buffer= Base64.getEncoder().encode(buffer);
        System.out.println(buffer.length);
        ObjectOutputStream oos= new ObjectOutputStream(client.getOutputStream());
        oos.writeObject(buffer);
        client.close();
    }
}

Node.js Сервер:

var fs = require('fs');
var net = require('net');
var sockets = [];
var server=net.createServer().listen(8080,"localhost");

server.on('connection', function(socket){
    console.log('Someone connected.');
    sockets.push(socket);
    var imageData;

    socket.on('data',function(data){
        imageData+= Buffer.from(data, 'base64');
    });

    socket.on('end',function(){
        console.log(imageData.length)
        fs.writeFileSync(new Date()+".png", imageData, function (err) {
          if (err) throw err;
          else  console.log('Saved!');
        });
    });

    socket.on('close',function(){
        console.log("Someone disconnected.");
    });
});

пожалуйста, мне нужна помощь, в четвертый раз я сделал этот вопроси никто не отвечает мне, или они говорят что-то, что не помогает, и дают мне -1. ​​

Вот вывод изображения

ОБНОВЛЕНИЕ:
Я попытался работать со строками, и я впервые обнаружил, что длина данных при получении не равна длине отправленных данных, поэтому я удалил лишние данные и все еще не работал, я думаю, что библиотека fs прослушивается, может кто-топредложить мне лучшую библиотеку, которая работает с файлом в Node.js?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Есть несколько ошибок, которые вызывают проблему.

Прежде всего, в коде отправителя вы используете 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, когда у нас есть вся строка.

Я пробовал это, и теперь оно работает нормально.

0 голосов
/ 07 октября 2018

Я думаю, вы преобразуете данные изображения в base64 в Java-клиенте, а затем снова конвертируете строку base64 в base64 в server.js.

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!');
        }); 
    });
...