为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

绝地无双 2021-11-03 15:08:48
我正在尝试将图像从 java TCP 客户端发送到 Node.js TCP 服务器我尝试过:发送二进制数据,发送 base64 编码的二进制数据,发送 utf-8 编码的字符串,目前没有任何效果,我总是得到数据并创建图像(使用 fs),但它总是损坏。这是我的代码:爪哇客户端: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。
查看完整描述

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事件期间完成的,当我们拥有整个字符串时。


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


查看完整回答
反对 回复 2021-11-03
?
杨魅力

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

        }); 

    });


查看完整回答
反对 回复 2021-11-03
  • 2 回答
  • 0 关注
  • 157 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信