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

标签 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 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 中的文件的更好的库吗?

最佳答案

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

首先,在您的发送方代码中,您使用了 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 - 将图像从 Java TCP 客户端发送到 Node.js TCP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52688958/

相关文章:

java - XML 解析 Java (Android)

java - Spring 4 @AutoWired 失败

Java比较两个日期年月日

javascript - 如何欺骗 Node.js 将 .js 文件加载为 ES6 模块?

c - Beej 的服务器客户端套接字示例在 cygwin 中不起作用

c - getline() 函数行为异常

java - Image View 和 onClickListener 问题

javascript - 无法显示 ng-view,包含在注释中

javascript - 在 JavaScript 中重构异步函数

python - socket sendall() 不发送数据