我正在尝试通过套接字在 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!");
最佳答案
您不能以这种简单的方式通过套接字传输文件。你没有给接收者任何线索,即将到来的字节数是多少。阅读 InputStream.read() 的 javadoc小心。您的接收器处于无限循环中,因为它正在等待下一个字节,直到流关闭。因此,您已通过在发送方调用 socket->close()
部分修复了该问题。理想情况下,您需要在缓冲区之前将 ban
的长度写入套接字,在接收方读取该长度,然后仅接收该字节数。在尝试读取接收到的文件之前,还要flush
和close
接收器流。
我完全不知道你想用 socket->write(ban+"-1")
实现什么。您记录的输出以 %PNG
开头,这是正确的。我可以在末尾看到 "-1"
,这意味着您向图像二进制文件添加了字符,因此损坏了它。为什么会这样?
不,1x1 PNG 的大小不是 1 个字节。它甚至没有 4 个字节(红色、绿色、蓝色、alpha)。 PNG 需要一些东西,比如标题和控制校验和。查看文件系统上文件的大小。这是您需要的 by
尺寸。
关于java - 使用qt通过套接字发送图像并使用java读取它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13004785/