我正在尝试将图像从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。
更新:
我尝试使用字符串,首先发现接收到的数据长度不等于发送的数据长度,所以我删除了多余的数据,但仍然无法正常工作,我认为fs库存在问题,有人可以建议我一个更好的库来处理Node.js中的文件吗?
答案 0 :(得分:1)
有几个错误导致此问题。
首先,在发送方代码中,您使用的是ObjectOutputStream
,顾名思义,它是用于发送对象的。您需要的是DataOutputStream
,它是为原始数据类型创建的。它也比ObjectOutputStream
快得多,因为它只能处理更少的情况。
因此,第一个更改将是这样的:
DataOutputStream oos= new DataOutputStream(client.getOutputStream());
oos.write(buffer);
下一个问题在接收方。 socket.on('data')
事件在传输过程中会发生很多次,即使我们收到的字符串相同!这意味着在从base64解码为原始数据之前,您将必须等待传输完成。您犯的另一个错误是在创建imageData
变量时不进行初始化。
让我们看一下使一切变得更清晰的代码。首先,声明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 :(得分:0)
我认为您是在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!');
});
});