java - 使用qt通过套接字发送图像并使用java读取它

标签 java qt sockets image-processing

我正在尝试通过套接字在 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!");

enter image description here

最佳答案

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

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

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

关于java - 使用qt通过套接字发送图像并使用java读取它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13004785/

相关文章:

linux - QML 可以使用 64 位 QtCreator 构建(编译)为 32 位

c - 当虚拟内存使用量达到256GB时进程输入界面停止响应

python - C 和 Python 之间的 Unix 套接字

java - 在数组上执行笛卡尔积

java - 在 JSF bean 之间传递数据

python - PyQt:表单布局内的 QLineEdit 小部件放置

c++ - 错误 `QObject` 子类和复制构造函数 : `QObject::QObject(const QObject&) is private`

java - Java 或 .NET 中的典型电子邮件监听器/迷你服务器

java - 设置 spring+hibernate maven 项目时遇到问题?

java - 使用 websocket 从多个设备聊天