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

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(); //如果要使用数据库作为文件的解析,可直接调用数据库文件解析函数即可
}
}

Qt PC 安卓 tcp传输文件的更多相关文章

  1. ARM 开发板嵌入式linux系统与主机PC通过串口传输文件

    本文转载自http://useless20.blog.163.com/blog/static/237409982010227127576/ 嵌入式linux系统与主机通过串口传输文件 我想如果要从PC ...

  2. WCF使用net.tcp传输文件

    摘要:今天看了一些官方的资料和配置,简单写了一个WCF服务来传递一个文件,借此看看WCF传输大文件的能力,这里采用的是NetTcp绑定,之所以没有采用 basicHttpBinding是因为考虑这种方 ...

  3. C# TCP传输文件示例代码

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. qt+boost::asio+tcp文件传输

    客户端: void qt_boost::pbSendFileClicked(){ QString filename = ui.leFileName->text(); QByteArray ba ...

  5. 在qt中用tcp传输xml消息

    在qt中用tcp传输xml消息 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5 3.1.2 说明: 在tcp上 ...

  6. Qt实现基于多线程的文件传输(服务端,客户端)

    1. 效果 先看看效果图 这是传输文件完成的界面 客户端 服务端 2. 知识准备 其实文件传输和聊天室十分相似,只不过一个传输的是文字,一个传输的是文件,而这方面的知识,我已经在前面的博客写过了,不了 ...

  7. JAVA之旅(三十三)——TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录

    JAVA之旅(三十三)--TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录 我们继续网络编程 一.TCP 说完UDP,我们就来说下我们应该重点掌握的TCP了 TCP传输 Soc ...

  8. java实现两台电脑间TCP协议文件传输

    记录下之前所做的客户端向服务端发送文件的小项目,总结下学习到的一些方法与思路. 注:本文参考自<黑马程序员>视频. 首先明确需求,在同一局域网下的机器人A想给喜欢了很久的机器人B发送情书, ...

  9. Py-解决粘包现象,tcp实现并发,tcp实现传输文件的程序,校验思路,线程与进程

    黏包现象 TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方TCP接收到 ...

随机推荐

  1. CentOS 安装postgresql

    CentOS 安装postgresql   添加postgresql官网安装源 在/etc/yum.repos.d目录下新建pgdg-10-centos.repo 文件 [pgdg10] name=P ...

  2. PAT——1012. 数字分类

    给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 = 能被5整除的数字中所有偶数的和: A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...: ...

  3. VS2008 工具栏CMFCToolBar的使用总结(转)

    (一)自定义工具栏 自定义工具栏,分两种情况:一是直接添加工具栏,并自己绘制图标:二是,添加工具栏,然后与BMP关联,与VC6.0中的自定义彩色工具栏类似. 1.  自绘工具栏 1)添加Toolbar ...

  4. linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)

    分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从<深入理解linux内核>这本书中摘抄几段关于上述名词的解释: 一.<深入理解linux内核>的解释 ...

  5. Unity 游戏框架搭建 (二十三) 重构小工具 Platform

    在日常开发中,我们经常遇到或者写出这样的代码 var sTrAngeNamingVariable = "a variable"; #if UNITY_IOS || UNITY_AN ...

  6. Oracle查找lobsegment、lobindex对应的表

    在查看表空间的使用情况的时候,发现有几个LOBSEGMENT.LOBINDEX类型的对象占用了大量的空间.于是想找出那些表占用了大量的空间,以便于清理.        Oracle对BLOB类型的定义 ...

  7. Oracle作业5——多表查询、子查询

    一.基础练习: 1.查询和scott相同部门的员工姓名ename和雇用日期hiredate SELECT ENAME,HIREDATE FROM EMP WHERE DEPTNO=(SELECT DE ...

  8. django, CentOS7+nginx(apache)+mod_wsgi+Python+Django

    Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS ...

  9. 04 关于oracle的锁的级别以及介绍

    关于oracle的锁的级别以及介绍 oracle造成锁表的情况: 一.查看锁的对象视图:select object_id,session_id,locked_mode from v$locked_ob ...

  10. iOS:动画(18-10-15更)

    目录 1.UIView Animation 1-1.UIView Animation(基本使用) 1-2.UIView Animation(转场动画) 2.CATransaction(Layer版的U ...