猿问

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

我正在尝试将图像从 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。

绝地无双
浏览 158回答 2
2回答

温温酱

有几个错误导致了问题。首先,在您的发件人代码中,您使用的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事件期间完成的,当我们拥有整个字符串时。我已经试过了,现在工作正常。

杨魅力

我认为您是在 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!');        });     });
随时随地看视频慕课网APP

相关分类

Java
我要回答