将图像从Java TCP客户端发送到Node.js TCP服务器

将图像从Java TCP客户端发送到Node.js TCP服务器,java,node.js,sockets,tcp,fs,Java,Node.js,Sockets,Tcp,Fs,我正在尝试将一个图像从java TCP客户端发送到Node.js TCP服务器。我尝试过:发送二进制数据,发送base64编码的二进制数据,发送utf-8编码的字符串。目前一切都不起作用,我总是得到数据,它创建了图像(使用fs),但它总是被破坏。 这是我的密码: JAVA客户端: import java.util.*; import java.io.*; import java.net.Socket; public class client{ public static void m

我正在尝试将一个图像从java TCP客户端发送到Node.js TCP服务器。我尝试过:发送二进制数据,发送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中的文件吗?

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

有几个错误导致了这个问题

首先,在发送者代码中,您使用的是一个
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
事件期间完成的,此时我们拥有整个字符串


我尝试过这个方法,现在效果很好。

尝试过你的方法,但没有效果,我认为解决方案不存在,因为当我尝试在不使用base64编码的情况下发送数据时,它根本不起作用。请检查客户端和服务器中字符串的长度是否相等。我已经检查过,它们不相等,当图像从java发送时,在Node.js中接收时,缓冲区长度为266564。是否有人能将这个问题+1,这样它可能会得到一些答案?你能给我+1,这样我就得到了我需要给你分数的声誉?