QT-应用(4)-TCPServer-传送文件(文本-视频)

本文介绍如何使用Ubuntu和QTcDemo开发一个支持多客户端连接的TCP服务器,能接收并处理文本和多媒体文件,实现分包发送、心跳检测与断点续传功能。核心部分展示了数据处理流程和关键API操作,适用于基础原型扩展。
摘要由CSDN通过智能技术生成


ubuntu+qt demo

功能:1.TCP服务器,接收多客户端
           2.接收客户端发来的文件(文本文件,其它多媒体文件(比如各视频文件))
           3.显示进度
对于大文件,长连接,会自定义一些协议,实现分包发送,心跳检测,断点续传之类的功能。本文不涉及业务,仅为最小原型,可在此基础上扩展。
  关键点:1.发送包头为:名字+长度    eg:filename#totalsize#
                 2.如果传输的是文本: bool ret=pf->open(QIODevice::WriteOnly|QIODevice::Text);
                    如果传输的是非文本:bool ret=pf_->open(QIODevice::WriteOnly|QIODevice::Unbuffered);

void mytcpserverfile::doProcessDataReady()
{
    QString msg;
    QTcpSocket* ptcpsocket = dynamic_cast<QTcpSocket*>(sender());
    QString info=ptcpsocket->peerAddress().toString()+":"+QString("%1").arg(ptcpsocket->peerPort());
  /*  QString strData=QString::fromLocal8Bit(ptcpsocket->readAll())+"\r\n";
    msg=QString("读取客户端[%1] 数据:%2").arg(info).arg(strData);
    ui->smsg_edittext->append(msg);*/
    QByteArray ba=ptcpsocket->readAll();

    //frist recv
    if(this->recvtotal_==0)
    {
        this->alltotal_=0;
        //eg:filename#totalsize#
        QStringList list=QString(ba).split("#");
        QString filename=list.at(0);
        this->alltotal_=QString(list.at(1)).toLong();
        this->alltotal_+=ba.length();
        this->recvtotal_+=ba.length();
       // qDebug()<< "rec filename="<<filename<<"file size"<<this->alltotal_;
        QString saveFilename="/home/tangcj/C++/QTProject/mytcpserverfile/savefiles/"+filename;
        pf_->setFileName(saveFilename);
        bool ret=pf_->open(QIODevice::WriteOnly|QIODevice::Unbuffered);
        if(!ret)
        {
             QMessageBox::warning(this,"warning","open failed!");
             return;
        }
        msg=QString("服务器 receving...:%1").arg(filename);
        ui->smsg_edittext->append(msg);
        ui->progressBar->setRange(0,alltotal_);
    }
    else
    {

        qint64 len=pf_->write(ba);
        this->recvtotal_+=len;
    }

    //更新进度条
    ui->progressBar->setValue(this->recvtotal_);
   //是否接收完毕
    if(this->recvtotal_==this->alltotal_)
    {
        pf_->close();
        this->recvtotal_=0;
        this->alltotal_=0;
        msg="文件接收完毕";
        ui->smsg_edittext->append(msg);
    }
}




           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值