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(); //如果要使用数据库作为文件的解析,可直接调用数据库文件解析函数即可
}
}
Qt PC 安卓 tcp传输文件的更多相关文章
- ARM 开发板嵌入式linux系统与主机PC通过串口传输文件
本文转载自http://useless20.blog.163.com/blog/static/237409982010227127576/ 嵌入式linux系统与主机通过串口传输文件 我想如果要从PC ...
- WCF使用net.tcp传输文件
摘要:今天看了一些官方的资料和配置,简单写了一个WCF服务来传递一个文件,借此看看WCF传输大文件的能力,这里采用的是NetTcp绑定,之所以没有采用 basicHttpBinding是因为考虑这种方 ...
- C# TCP传输文件示例代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- qt+boost::asio+tcp文件传输
客户端: void qt_boost::pbSendFileClicked(){ QString filename = ui.leFileName->text(); QByteArray ba ...
- 在qt中用tcp传输xml消息
在qt中用tcp传输xml消息 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5 3.1.2 说明: 在tcp上 ...
- Qt实现基于多线程的文件传输(服务端,客户端)
1. 效果 先看看效果图 这是传输文件完成的界面 客户端 服务端 2. 知识准备 其实文件传输和聊天室十分相似,只不过一个传输的是文字,一个传输的是文件,而这方面的知识,我已经在前面的博客写过了,不了 ...
- JAVA之旅(三十三)——TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录
JAVA之旅(三十三)--TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录 我们继续网络编程 一.TCP 说完UDP,我们就来说下我们应该重点掌握的TCP了 TCP传输 Soc ...
- java实现两台电脑间TCP协议文件传输
记录下之前所做的客户端向服务端发送文件的小项目,总结下学习到的一些方法与思路. 注:本文参考自<黑马程序员>视频. 首先明确需求,在同一局域网下的机器人A想给喜欢了很久的机器人B发送情书, ...
- Py-解决粘包现象,tcp实现并发,tcp实现传输文件的程序,校验思路,线程与进程
黏包现象 TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方TCP接收到 ...
随机推荐
- FactoryBean的实现原理与作用
FactoryBean与BeanFactory: 这俩货在拼写上很是相似,很多同学在看IOC源码或者其他地方并不能分清有啥区别,前面的IOC源码中我简单说过,现在统一简单来讲一下: FactoryBe ...
- 根据身份证获取地址(mysql)
e Encoding : Date: :: */ ; -- ---------------------------- -- Table structure for `s_area_code` -- - ...
- 【题解】洛谷P2679 [NOIP2015TG] 子串(DP+滚动数组)
次元传送门:洛谷P2679 思路 蒟蒻一开始并没有思路而去看了题解 我们发现对于两个字串的位置 我们只需要管他们匹配成功或者匹配失败即可 f[i][j][k] 记录当前 a[i]不论等不等于b[j] ...
- HDU4825 Xor Sum
题意 给定一个集合后, 求一组查询中每个数和集合中任一元素异或的最大值. 题解 异或的规律是这样的 1 ^ 1 = 0, 0 ^ 0 = 0, 1 ^ 0 = 1, 0 ^ 1 = 1, 而最大值即是 ...
- Ajax全局加载框(Loading效果)的配置
在Ajax进行后台数据请求的过程中,我们有时候会希望用户能知道页面后台还在做一些事情,这时候就需要给用户一个非常明确的提示,也就是我们所谓的进度条 废话完成~ 实现原理: Jquery可以对ajax进 ...
- react系列(一)JSX语法、组件概念、生命周期介绍
JSX React中,推出了一种新的语法取名为JSX,它给了JS中写HTML标签的能力,不需要加引号.JSX的语法看起来是一种模板,然而它在编译以后,会转成JS语法,只是书写过程中的语法糖. JSX的 ...
- oracle 之分析函数 over (partition by ...order by ...)
一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行. 1.分析函数和聚合函数的 ...
- Oracle 备份恢复实例
Oracle 备份恢复实例:三思笔记 1 shutdown abort 系统归档模式,有备份 create table xx as select * from emp; update xx set e ...
- Dynamic Ambient Occlusion and Indirect Lighting
This sample was presented on the Nvida witesite, which detail a new idea to calculate the ambient oc ...
- Python记录键盘鼠标敲击次数
Idea 作为一个每天有一半时间都在电脑旁的人,无时无刻不在敲击着键盘,点击着鼠标.有一天,我突然很想知道在一天的时间内,在我轻盈的指法下面,键盘被我狂敲了多少下,鼠标又被我点击了多少次.甚至更具体一 ...