将图像从Java TCP客户端发送到Node.js TCP服务器
我正在尝试将一个图像从java TCP客户端发送到Node.js TCP服务器。我尝试过:发送二进制数据,发送base64编码的二进制数据,发送utf-8编码的字符串。目前一切都不起作用,我总是得到数据,它创建了图像(使用fs),但它总是被破坏。 这是我的密码: JAVA客户端:将图像从Java TCP客户端发送到Node.js TCP服务器,java,node.js,sockets,tcp,fs,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 m
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中的文件吗?我想您是在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!');
});
});
有几个错误导致了这个问题 首先,在发送者代码中,您使用的是一个
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
事件期间完成的,此时我们拥有整个字符串
我尝试过这个方法,现在效果很好。尝试过你的方法,但没有效果,我认为解决方案不存在,因为当我尝试在不使用base64编码的情况下发送数据时,它根本不起作用。请检查客户端和服务器中字符串的长度是否相等。我已经检查过,它们不相等,当图像从java发送时,在Node.js中接收时,缓冲区长度为266564。是否有人能将这个问题+1,这样它可能会得到一些答案?你能给我+1,这样我就得到了我需要给你分数的声誉?