4

我正在尝试通过套接字在 Qt 服务器中发送图像上传,并在使用 Java 创建的客户端中将其可视化。到目前为止,我只传输字符串进行双方通信,并尝试了不同的示例来发送图像但没有结果。

我用来在qt中传输图像的代码是:

QImage image;
image.load("../punton.png");
qDebug()<<"Image loaded";
QByteArray ban; // Construct a QByteArray object
QBuffer buffer(&ban);   // Construct a QBuffer object using the QbyteArray
image.save(&buffer, "PNG"); // Save the QImage data into the QBuffer
socket->write(ban);        

在另一端,用 Java 读取的代码是:

BufferedInputStream in = new BufferedInputStream(socket.getInputStream(),1);
File f = new File("C:\\Users\\CLOUDMOTO\\Desktop\\JAVA\\image.png");
System.out.println("Receiving...");
FileOutputStream fout = new FileOutputStream(f);
byte[] by = new byte[1];
for(int len; (len = in.read(by)) > 0;){
fout.write(by, 0, len);
System.out.println("Done!");
}

Java 中的进程一直卡住,直到我关闭 Qt 服务器,然后生成的文件已损坏。

我会很感激任何帮助,因为这样做对我来说是必要的,而且我是使用两种语言编程的新手。

此外,我使用了以下命令,接收过程现在结束并显示一条消息,但文件已损坏。

socket->write(ban+"-1"); 
socket->close(); in qt. 

在java中:

System.out.println(by); 
String received = new String(by, 0, by.length, "ISO8859_1");
System.out.println(received);
System.out.println("Done!");

在此处输入图像描述

4

1 回答 1

1

您不能以这种简单的方式通过套接字传输文件。您没有给接收者任何线索,即将到来的字节数。仔细阅读InputStream.read()的 javadoc。您的接收器处于无限循环中,因为它正在等待下一个字节,直到流关闭。socket->close()因此,您通过在发送方调用已部分解决了该问题。理想情况下,您需要ban在缓冲区之前将长度写入套接字,在接收方读取该长度,然后仅接收该字节数。在尝试读取接收到的文件之前,还有接收器flush流。close

我完全不知道你想用socket->write(ban+"-1"). 您记录的输出以%PNG正确的开头。我可以"-1"在最后看到,这意味着您将字符添加到图像二进制文件中,因此您损坏了它。为什么这样?

不,1x1 PNG 的大小不是 1 字节。它甚至没有 4 个字节(红色、绿色、蓝色、alpha)。PNG需要一些东西,比如标题和控制校验和。查看文件系统上文件的大小。这是您需要的by尺寸。

于 2012-10-22T12:47:11.580 回答