我正在尝试将图像从 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 中的文件的更好的库吗?
最佳答案
有几个错误导致了这个问题。
首先,在您的发送方代码中,您使用了 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/