Qt PC 安卓 tcp传输文件

举报
DreamLife 发表于 2022/04/15 22:47:21 2022/04/15
【摘要】 废话不多说,如题,上代码     qt PC端头文件//网络部分#include <QTcpSocket>#include <QFile>#include <QFileDialog>#include <QHeaderView>#include <QScrol...

废话不多说,如题,上代码

 

 


  
  1. qt PC端
  2. 头文件
  3. //网络部分
  4. #include <QTcpSocket>
  5. #include <QFile>
  6. #include <QFileDialog>
  7. #include <QHeaderView>
  8. #include <QScrollBar>
  9. 具体实现
  10. void MainForm::openFile() //打开文件
  11. {
  12. filename = QFileDialog::getOpenFileName(this);
  13. if(!filename.isEmpty())
  14. {
  15. qDebug()<<"open file ok"<<filename;
  16. }
  17. }
  18. void MainForm::send()
  19. {
  20. tcpClient->connectToHost(ui->lineEdit->text(),8888);
  21. }
  22. void MainForm::startTransfer()
  23. {
  24. localFile = new QFile(filename);
  25. if(!localFile->open(QFile::ReadOnly))
  26. {
  27. QMessageBox::information(this,"警告","文件打开失败",QMessageBox::Ok);
  28. return;
  29. }
  30. totalBytes = localFile->size();
  31. QDataStream sendout(&outlock,QIODevice::WriteOnly);
  32. sendout.setVersion(QDataStream::Qt_5_3);
  33. QString currentFileName = filename.right(filename.size()-filename.lastIndexOf("/")-1);
  34. sendout << qint64(0) << qint64(0) <<currentFileName;
  35. totalBytes += outlock.size();
  36. sendout.device()->seek(0);
  37. sendout<<totalBytes<<qint64((outlock.size() - sizeof(qint64)*2));
  38. bytestowrite = totalBytes - tcpClient->write(outlock);
  39. qDebug("已连接");
  40. outlock.resize(0);
  41. }
  42. void MainForm::updaraclientprogress(qint64 numbytes)
  43. {
  44. bytesWrittens += (int)numbytes;
  45. if(bytestowrite > 0)
  46. {
  47. outlock = localFile->read(qMin(bytestowrite,locaksize));
  48. bytestowrite -= (int)tcpClient->write(outlock);
  49. outlock.resize(0);
  50. }
  51. else {
  52. localFile->close();
  53. }
  54. qDebug()<<bytestowrite<<"-------------------->>";
  55. if(bytesWrittens == totalBytes)
  56. {
  57. qDebug("发送完成");
  58. localFile->close();
  59. tcpClient->close();
  60. QMessageBox::information(this,"提示","同步完成",QMessageBox::Ok);
  61. }
  62. }

 

 

 

 

 

 

 


  
  1. 接收端
  2. void Widget::start()
  3. {
  4. reciverBytes = 0;
  5. tcpserver.listen(QHostAddress::Any,8888); //监听任意IP的8888端口
  6. connect(&tcpserver,SIGNAL(newConnection()),this,SLOT(acceptConnection())); //当有新的连接连入客户端时,启动文件接受
  7. }
  8. //建立连接
  9. void Widget::acceptConnection()
  10. {
  11. tcpserverconnection = tcpserver.nextPendingConnection(); //建立连接
  12. connect(tcpserverconnection,SIGNAL(readyRead()),this,SLOT(updataServerProgress())); //发送连接信号
  13. connect(tcpserverconnection,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(disPlayError(QAbstractSocket::SocketError))); //将新的连接与信息处理连接,当连接出现问题是,输出相应的错误信息
  14. QString IPAddressString; //用于存放对方的Ip地址,
  15. QList<QHostAddress> ipAddresslist = QNetworkInterface::allAddresses(); //获取所有的IP地址
  16. for(int i=0;i<ipAddresslist.size();i++) //获取连入主机的IP
  17. {
  18. if(ipAddresslist.at(i) != QHostAddress::LocalHost && ipAddresslist.at(i).toIPv4Address()) //获得IPv4
  19. {
  20. IPAddressString = ipAddresslist.at(i).toString(); //获得IPv4地址
  21. break;
  22. }
  23. if(ipAddresslist.isEmpty()) //如果ip地址列表为空,则表示现在没有任何用户连接到主机,显示主机自己的IP,其实,这个也是不会执行的,有连接不然会有IP,不会存在连接存在,而IP没有的时候
  24. {
  25. IPAddressString = QHostAddress(QHostAddress::LocalHost).toString(); //获取本机IP地址
  26. }
  27. }
  28. }
  29. void Widget::updataServerProgress() //接收文件
  30. {
  31. QDataStream in(tcpserverconnection);
  32. in.setVersion(QDataStream::Qt_5_3); //使用QDataStream::Qt_5_3 协议解析数据
  33. if(reciverBytes <= sizeof(qint64)*2) //如果文件数据小雨16字节,那么是刚开始传输数据,我们保存的我//未来的头文件信息
  34. {
  35. if((tcpserverconnection->bytesAvailable()>=sizeof(qint64)*2)&&(fileNameSize ==0))
  36. { //接收数据总大小信息和文件名大小信息
  37. in >> totalBytes >>fileNameSize;
  38. reciverBytes += sizeof(qint64)*2;
  39. }
  40. if((tcpserverconnection->bytesAvailable()>=fileNameSize)&&(fileNameSize!=0))
  41. { //接受文件名,并建立文件
  42. in >> fileName;
  43. reciverBytes += fileNameSize;
  44. localFile = new QFile(fileName);
  45. if(!localFile->open(QFile::WriteOnly))
  46. {
  47. return;
  48. }
  49. }
  50. else return;
  51. }
  52. if(reciverBytes < totalBytes)
  53. { //如果接收数据小于总数据,那么将数据信息写入文件中。
  54. reciverBytes += tcpserverconnection->bytesAvailable();
  55. inblokc = tcpserverconnection->readAll();
  56. localFile->write(inblokc);
  57. inblokc.resize(0);
  58. }
  59. if(reciverBytes == totalBytes)
  60. { //接受完成时,关闭文件,变量初始化
  61. tcpserverconnection->close();
  62. localFile->close();
  63. totalBytes =0;
  64. reciverBytes =0;
  65. fileNameSize = 0;
  66. // opendatabase(); //如果要使用数据库作为文件的解析,可直接调用数据库文件解析函数即可
  67. }
  68. }

 

 

 

 

 

 

 

 

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/47339203

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。