【问题标题】:Send Image from Java TCP Client to Node.js TCP Server将图像从 Java TCP 客户端发送到 Node.js TCP 服务器
【发布时间】:2019-03-12 08:08:14
【问题描述】:

我正在尝试将图像从 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 中的文件的更好的库吗?

【问题讨论】:

    标签: java node.js sockets tcp fs


    【解决方案1】:

    有几个错误导致了问题。

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

    我试过了,现在可以正常使用了。

    【讨论】:

    • 你能给我+1,所以我得到了我需要给你积分的声誉吗?
    【解决方案2】:

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

    【讨论】:

    • 试过你的方法,但没用,我认为没有解决方案,因为当我尝试发送没有 base64 编码的数据时,它无论如何都不起作用。
    • 检查客户端和服务器的字符串长度是否相等。
    • 我检查过它们不相等,当图像从 java 发送时,缓冲区长度为 266564,而在 Node.js 中接收时为 266600。
    • 有人可以将此问题 +1,以便它得到一些答案吗?
    猜你喜欢
    • 1970-01-01
    • 2014-05-15
    • 2020-01-22
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2012-11-03
    相关资源
    最近更新 更多