将图像从Java TCP Client发送到Node.js TCP Server

时间:2018-10-07 13:28:17

标签: java node.js sockets tcp fs

我正在尝试将图像从Java TCP Client发送到Node.js TCP Server,我尝试了以下操作:发送二进制数据,发送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。

Here is the image output

更新:
我尝试使用字符串,首先发现接收到的数据长度不等于发送的数据长度,所以我删除了多余的数据,但仍然无法正常工作,我认为fs库存在问题,有人可以建议我一个更好的库来处理Node.js中的文件吗?

2 个答案:

答案 0 :(得分:1)

有几个错误导致此问题。

首先,在发送方代码中,您使用的是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事件期间完成。

我已经尝试过了,现在工作正常。

答案 1 :(得分:0)

我认为您是在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!');
        }); 
    });