Qt PC 安卓 tcp传输文件

简介: 废话不多说,如题,上代码
qt PC端
头文件
//网络部分
#include <QTcpSocket>
#include <QFile>
#include <QFileDialog>
#include <QHeaderView>
#include <QScrollBar>
具体实现
void MainForm::openFile()               //打开文件
{
    filename = QFileDialog::getOpenFileName(this);
    if(!filename.isEmpty())
    {
        qDebug()<<"open file ok"<<filename;
    }
}
void MainForm::send()
{
    tcpClient->connectToHost(ui->lineEdit->text(),8888);
}
void MainForm::startTransfer()
{
    localFile = new QFile(filename);
    if(!localFile->open(QFile::ReadOnly))
    {
        QMessageBox::information(this,"警告","文件打开失败",QMessageBox::Ok);
        return;
    }
    totalBytes = localFile->size();
    QDataStream sendout(&outlock,QIODevice::WriteOnly);
    sendout.setVersion(QDataStream::Qt_5_3);
    QString currentFileName = filename.right(filename.size()-filename.lastIndexOf("/")-1);
    sendout << qint64(0) << qint64(0) <<currentFileName;
    totalBytes += outlock.size();
    sendout.device()->seek(0);
    sendout<<totalBytes<<qint64((outlock.size() - sizeof(qint64)*2));
    bytestowrite = totalBytes - tcpClient->write(outlock);
    qDebug("已连接");
    outlock.resize(0);
}
void MainForm::updaraclientprogress(qint64 numbytes)
{
    bytesWrittens += (int)numbytes;
    if(bytestowrite > 0)
    {
        outlock = localFile->read(qMin(bytestowrite,locaksize));
        bytestowrite -= (int)tcpClient->write(outlock);
        outlock.resize(0);
    }
    else {
        localFile->close();
    }
    qDebug()<<bytestowrite<<"-------------------->>";
    if(bytesWrittens == totalBytes)
    {
        qDebug("发送完成");
        localFile->close();
        tcpClient->close();
        QMessageBox::information(this,"提示","同步完成",QMessageBox::Ok);
    }
}
接收端
void Widget::start()
{
    reciverBytes = 0;
    tcpserver.listen(QHostAddress::Any,8888);           //监听任意IP的8888端口
    connect(&tcpserver,SIGNAL(newConnection()),this,SLOT(acceptConnection()));   //当有新的连接连入客户端时,启动文件接受
}
//建立连接
void Widget::acceptConnection()
{
    tcpserverconnection = tcpserver.nextPendingConnection();                                                                            //建立连接
    connect(tcpserverconnection,SIGNAL(readyRead()),this,SLOT(updataServerProgress()));                                                 //发送连接信号
    connect(tcpserverconnection,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(disPlayError(QAbstractSocket::SocketError)));     //将新的连接与信息处理连接,当连接出现问题是,输出相应的错误信息
    QString IPAddressString;                                                                                                            //用于存放对方的Ip地址,
    QList<QHostAddress> ipAddresslist = QNetworkInterface::allAddresses();                                                              //获取所有的IP地址
    for(int i=0;i<ipAddresslist.size();i++)                                                                                             //获取连入主机的IP
    {
        if(ipAddresslist.at(i) != QHostAddress::LocalHost && ipAddresslist.at(i).toIPv4Address())                                       //获得IPv4
        {
            IPAddressString = ipAddresslist.at(i).toString();                                                                           //获得IPv4地址
            break;
        }
        if(ipAddresslist.isEmpty())                                                                                                     //如果ip地址列表为空,则表示现在没有任何用户连接到主机,显示主机自己的IP,其实,这个也是不会执行的,有连接不然会有IP,不会存在连接存在,而IP没有的时候
        {
            IPAddressString = QHostAddress(QHostAddress::LocalHost).toString();                                                         //获取本机IP地址
        }
    }
}
void Widget::updataServerProgress()                                                                                                     //接收文件
{
    QDataStream in(tcpserverconnection);
    in.setVersion(QDataStream::Qt_5_3);                                                                                                 //使用QDataStream::Qt_5_3 协议解析数据
    if(reciverBytes <= sizeof(qint64)*2)                                                                                                //如果文件数据小雨16字节,那么是刚开始传输数据,我们保存的我//未来的头文件信息
    {
        if((tcpserverconnection->bytesAvailable()>=sizeof(qint64)*2)&&(fileNameSize ==0))
        {                                                                                                                               //接收数据总大小信息和文件名大小信息
            in >> totalBytes >>fileNameSize;
            reciverBytes += sizeof(qint64)*2;
        }
        if((tcpserverconnection->bytesAvailable()>=fileNameSize)&&(fileNameSize!=0))
        {                                                                                                                               //接受文件名,并建立文件
            in >> fileName;
            reciverBytes += fileNameSize;
            localFile = new QFile(fileName);
            if(!localFile->open(QFile::WriteOnly))
            {
                return;
            }
        }
    else return;
    }
    if(reciverBytes < totalBytes)
    {                                                                                                                                   //如果接收数据小于总数据,那么将数据信息写入文件中。
        reciverBytes += tcpserverconnection->bytesAvailable();
        inblokc = tcpserverconnection->readAll();
        localFile->write(inblokc);
        inblokc.resize(0);
    }
    if(reciverBytes == totalBytes)
    {                                                                                                                                   //接受完成时,关闭文件,变量初始化
        tcpserverconnection->close();
        localFile->close();
        totalBytes =0;
        reciverBytes =0;
        fileNameSize = 0;
//        opendatabase();                                                                                                               //如果要使用数据库作为文件的解析,可直接调用数据库文件解析函数即可
    }
}
目录
相关文章
|
2月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
270 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
228 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
564 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
137 0
|
4月前
|
存储 Web App开发 Ubuntu
手机变PC:给安卓手机刷Ubuntu Touch系统
至此,魅族PRO 5刷入Ubuntu Touch即完成了。 魅族PRO 5的Ubuntu Touch的开机画面如下:
951 0
|
7月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
178 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
7月前
|
Java Android开发
Android studio中build.gradle文件简单介绍
本文解析了Android项目中build.gradle文件的作用,包括jcenter仓库配置、模块类型定义、包名设置及依赖管理,涵盖本地、库和远程依赖的区别。
624 19
|
10月前
|
移动开发 安全 Java
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
994 83
|
7月前
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
1798 2
|
10月前
|
安全 Android开发 数据安全/隐私保护
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
451 12
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件

推荐镜像

更多
  • qt