Qt QTcpSocket 流式传输

Posted

技术标签:

【中文标题】Qt QTcpSocket 流式传输【英文标题】:Qt QTcpSocket streaming 【发布时间】:2014-06-06 16:10:42 【问题描述】:

我的应用程序通过QTcpSocket 将对象发送到服务器。

客户:

void client::sendFile(QString path)

    QFile toSend(path);
    QByteArray rawFile;
    rawFile = toSend.readAll();

    QDataStream out(cl);
    out >> rawFile;

服务器:

void server::handleClient()

    QTcpSocket *curCl = srv->nextPendingConnection();
    QByteArray z;
    QDataStream in(curCl);
    in >> z;

    QFile qwe("test.dat");
    qwe.write(z);
    qwe.close();

问题是什么都没有发生,但调试控制台告诉我:

QIODevice::write: device not open
QIODevice::read: device not open

...但是QDataStream 对象不允许我设置打开模式! :( 怎么了?

【问题讨论】:

【参考方案1】:

QFile + QFile.write(或QFile.read)需要QFile.open,参见示例:

写:

QFile qwe("test.dat");
if(qwe.open(QIODevice::WriteOnly | QIODevice::Text)) 
  qwe.write(z);
  qwe.close();
 else 
  qDebug() << "Error";

#include <QTextStream>

...

QFile qwe("test.dat");
if(qwe.open(QIODevice::WriteOnly | QIODevice::Text))
   QTextStream out(&qwe);
   out << "This file is generated by Qt\n";
   qwe.close();
 else 
  qDebug() << "Error";

阅读:

QFile toSend(path);
if(toSend.open(QIODevice::ReadOnly | QIODevice::Text)) //Open "read file"
    QByteArray rawFile;
    rawFile = toSend.readAll();

    QDataStream out(cl);
    out >> rawFile;
    toSend.close();//close

【讨论】:

以上是关于Qt QTcpSocket 流式传输的主要内容,如果未能解决你的问题,请参考以下文章

使用 Qt 流式传输

Qt 通过 TCP 套接字实时流式传输音频

C++ Qt - QTcpSocket - 找不到文件

Qt - 当一个类中有多个 QTcpSocket 时,我如何知道哪个 QTcpSocket 发出了 readyRead 信号?

如何安全地删除 QT::QTcpSocket?

Qt的QTcpSocket ReadyRead信号的实现