QT笔记之VS2012 TCP传送文件
注意:工程监理后,因为用到网路,所以要加入对应的库
服务器:
.h
#ifndef TCPFILE_H
#define TCPFILE_H #include <QtWidgets/QWidget>
#include "ui_tcpfile.h"
#include <QtNetwork/QTcpServer>//监听套接字
#include <QtNetwork/QTcpSocket>//通信套接字
#include <QFile>
#include <QTimer> class TCPFile : public QWidget
{
Q_OBJECT public:
TCPFile(QWidget *parent = );
~TCPFile(); void SendData();//发送文件数据函数 private slots:
void on_buttonSelect_clicked(); void on_buttonSend_clicked(); private:
Ui::TCPFileClass ui; QTcpServer* tcpServer;//监听套接字
QTcpSocket* tcpSocket;//通信套接字 QFile file;//文件对象
QString filename;//文件名字
qint64 filesize;//文件大小
qint64 sendsize;//已发送文件大小 QTimer timer;//定时器
}; #endif // TCPFILE_H
.cpp
#include "tcpfile.h"
#include <QTextCodec>
#include <QFileDialog>//选择文件对话框
#include <QDebug>
#include <QFileInfo>//文件信息 TCPFile::TCPFile(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this); //监听套接字
tcpServer = new QTcpServer(this); //监听
tcpServer->listen(QHostAddress::Any,); QTextCodec *codec = QTextCodec::codecForLocale();//解决中文乱码 QString Titleinfo = codec->toUnicode("服务器端口为:8888"); setWindowTitle(Titleinfo); //建立连接之前两个按钮不可用
ui.buttonSelect->setEnabled(false);
ui.buttonSend->setEnabled(false); //如果客户端和服务器连接
//tcpServer会自动触发 newConnection() connect(tcpServer,&QTcpServer::newConnection,
[=]()
{
//取出建立好连接的套接字
tcpSocket = tcpServer->nextPendingConnection(); //获取对方的ip和port
QString strIP = tcpSocket->peerAddress().toString();
quint16 port = tcpSocket->peerPort(); QString str = QStringLiteral("[%1,%2] 成功连接").arg(strIP).arg(port);
//str = codec->toUnicode(str); ui.textEdit->setText(str);//显示到编辑框 //成功连接后 选择按钮可用 ui.buttonSelect->setEnabled(true);
}
); connect(&timer,&QTimer::timeout,
[=]()
{
//关闭定时器
timer.stop();
SendData();
}
);
} TCPFile::~TCPFile()
{ } void TCPFile::on_buttonSelect_clicked()
{
QString filepath = QFileDialog::getOpenFileName(this,"open","../"); if(!filepath.isEmpty())
{
//文件路径有效
//只读方式打开文件
filename.clear();
filesize = ; QFileInfo info(filepath);//获取文件信息
filename = info.fileName();
filesize = info.size(); sendsize = ;//发送文件的大小 file.setFileName(filepath); //打开文件 bool isOk = file.open(QIODevice::ReadOnly); if(false == isOk)
{
qDebug() << "只读方式打开文件失败";
}
else
{
//提示打开文件的路径
ui.textEdit->append(filepath);
ui.buttonSelect->setEnabled(false);
ui.buttonSend->setEnabled(true); }
}
} void TCPFile::on_buttonSend_clicked()
{
//先发送文件头部信息
QString head = QString("%1##%2").arg(filename).arg(filesize);//自定义文件头部 //发送头部信息
qint64 len = tcpSocket->write(head.toUtf8());
if(len > )//头部信息发送成功
{
//发送真正的文件信息
//防止TCP粘包文件
//需要通过定时器延时 20ms timer.start();
}
else
{
qDebug() << "头部信息发送失败 115";
file.close(); ui.buttonSelect->setEnabled(true);
ui.buttonSend->setEnabled(false);
}
} void TCPFile::SendData()
{
qint64 len = ; do
{
//每次发送数据的大小
char buf[*] = {};
len = ; //往文件中读数据
len = file.read(buf,sizeof(buf));
//发送数据 读多少 发送多少 //发送多好
len = tcpSocket->write(buf,len);
sendsize += len;
}while(len > ); if(sendsize == filesize)
{
ui.textEdit->append("file finshed");
file.close(); //把客户端断开连接
tcpSocket->disconnectFromHost();
tcpSocket->close();
}
}
客户端
.h
#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H #include <QWidget>
#include "ui_clientwidget.h"
#include <QtNetwork/QTcpSocket>//通信套接字
#include <QFile> class ClientWidget : public QWidget
{
Q_OBJECT public:
ClientWidget(QWidget *parent = );
~ClientWidget(); private slots:
void on_buttonConnect_clicked(); private:
Ui::ClientWidget ui; QTcpSocket* tcpSocket;//通信套接字 QFile file;//文件对象
QString filename;//文件名字
qint64 filesize;//文件大小
qint64 recvsize;//已接收文件大小 bool isHead;//是否是头
}; #endif // CLIENTWIDGET_H
.cpp
#include "clientwidget.h"
#include <QMessageBox>
#include <QHostAddress>
#include <QTextCodec> ClientWidget::ClientWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this); tcpSocket = new QTcpSocket(this); setWindowTitle(QStringLiteral("客户端")); isHead = true; QTextCodec *codec = QTextCodec::codecForLocale();//解决中文乱码 connect(tcpSocket,&QTcpSocket::readyRead,
[=]()
{
//取出接收到的东西
QByteArray buf = tcpSocket->readAll(); if (isHead)
{//接收头
isHead = false;
//解析头部信息 QString buf = "hello##1024"; 文件名为 "hello" 大小为 1024
// QString str ="hello##1024";
//str.section("##",0,0); 取出 "hello"
//str.section("##",1,1); 取出 "1024" filename = QString(buf).section("##", , );
filesize = QString(buf).section("##", , ).toInt();
recvsize = ; //初始化
//打开文件 file.setFileName(filename); bool isOk = file.open(QIODevice::WriteOnly); if (false == isOk)
{
QMessageBox::information(this,"打开","文件打开失败");
} }
else
{
//文件信息
qint64 len = file.write(buf); recvsize += len; if (recvsize == filesize)
{
file.close();
QString title = codec->toUnicode("完成");
QString info = codec->toUnicode("接收完成");
QMessageBox::information(this,title,info); //断开连接
tcpSocket->disconnectFromHost();
tcpSocket->close();
} }
}
);
} ClientWidget::~ClientWidget()
{ } void ClientWidget::on_buttonConnect_clicked()
{
//获取服务器的IP和端口 QString strIP = ui.lineEditIP->text();
quint16 port = ui.lineEditPort->text().toInt(); tcpSocket->connectToHost(QHostAddress(strIP),port);
}
main文件
#include "tcpfile.h"
#include <QtWidgets/QApplication>
#include "clientwidget.h" int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TCPFile w;
w.show(); ClientWidget cw;
cw.show(); return a.exec();
}
运行效果:
第一步:
第二步:
第三步:
第四步:
QT笔记之VS2012 TCP传送文件的更多相关文章
- 读书笔记——《图解TCP/IP》(1/4)
读书笔记——<图解TCP/IP>(1/4) 经典摘抄 第一章 网络基础知识 1.独立模式:计算机未连接到网络,各自独立使用的方式. 2.广域网 WAN 局域网 LAN 城域网 MAN 3. ...
- SZ,RZ传送文件
linux 和window之间通过xshell的命令 SZ,RZ传送文件:
- python使用简单http协议来传送文件
python使用简单http协议来传送文件!在ubuntu环境下,局域网内可以使用nc来传送文件,也可以使用基于Http协议的方式来下载文件我们可以使用python -m SimpleHTTPServ ...
- QT运行时加载UI文件
写QT程序里运行时加载UI文件,代码如下: 点击(此处)折叠或打开 #include "keyboard.h" #include <QtUiTools> #incl ...
- Linux SSH 远程操作与传送文件
操作系统:centos 6.5 x64 一.远程连接:在进行linux 的 ssh远程操作前,一定要确认linux 是否安装了 openssh-clients,为了方便起见,一般用yum安装即可:# ...
- SCP传送文件时提示No ECDSA host key is known forx.x.x.x and you have requested strict checking.问题的解决办法
在使用SCP向其他设备传送文件时,打印如下错误: No ECDSA host key is known for x.x.x.x and you have requested strict checki ...
- Delphi IdTCPClient IdTCPServer 点对点传送文件
https://blog.csdn.net/luojianfeng/article/details/53959175 2016年12月31日 23:40:15 阅读数:2295 Delphi ...
- InstallShield 2015 LimitedEdition VS2012 运行bat文件
转载:http://www.cnblogs.com/fengwenit/p/4271150.html 运行bat文件 网上很多介绍如何运行bat的方法,但我这个是limted 版本,不适用. 1. ...
- Qt SD卡 文件系统挂载、文件预览
/********************************************************************************** * Qt SD卡 文件系统挂载. ...
随机推荐
- Linux(Ubuntu)环境下使用Fiddler
自己的开发环境是Ubuntu, 对于很多优秀的软件但是又没有Linux版本这件事,还是有点遗憾的.比如最近遇到一个问题,在分析某个网站的请求路径和cookie时就遇到了问题.本来Chome浏览器自带的 ...
- git pull 冲突解决
这个意思是说更新下来的内容和本地修改的内容有冲突,先提交你的改变或者先将本地修改暂时存储起来. 处理的方式非常简单,主要是使用git stash命令进行处理,分成以下几个步骤进行处理. 1.先将本地修 ...
- Ubuntu下查看机器信息
原文地址 测试机器的硬件信息 查看CPU信息(看到有8个逻辑CPU, 也知道了CPU型号) # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq ...
- c#项目架构搭建经验
读过.Net项目中感觉代码写的不错(备注1)有:bbsMax(可惜唧唧喳喳鸟像消失了一样),Umbraco(国外开源的cms项目),Kooboo(国内做开源cms).本人狭隘,读的代码不多,范围也不广 ...
- c++模板函数实例化的偏序机制
一:废话 今天在stackoverflow上看到一个关于c++模板specialization的问题: http://stackoverflow.com/questions/18283851/temp ...
- eclipse自动补全快捷键失效,sysout用不了!
好久没写Java代码了,使用新版Neon的Eclipse Java EE IDE开发时,自动补全各种失败,sysout也各种用不了, 开始还以为是电脑卡比呢,原来是版本的快捷键不同了,修改方法如下! ...
- 服务器支持AspJpeg和JMail45_free.msi组件
解决办法: 1.在服务器上安装上AspJpeg和JMail45_free.msi后, 2.在cmd中输入regsvr32 c:/windows/SysWOW64/aspjpeg.dll 3.把网站对 ...
- OpenCV整体的模块架构
之前啃了不少OpenCV的官方文档,发现如果了解了一些OpenCV整体的模块架构后,再重点学习自己感兴趣的部分的话,就会有一览众山小的感觉,于是,就决定写出这篇文章,作为启程OpenCV系列博文的第二 ...
- Linux上USB移植错误解决笔记
在内核目录下先配置支持USB设备,无论你是什么设备,这一步都是必须的,USB驱动和其他的驱动不同,它分为USB设备驱动,另外还有USB-Host主机控制器的驱动,配置如下: Device Driver ...
- Asp.net MVC5 框架揭秘 S412 实例解析 – 绝妙的扩展 模式的胜利
Asp.net MVC5 框架是个 开源的,处处可扩展的框架. 蒋先生 在他的这本书里 对如何理解框架,如何扩展框架, 给出了大量的说明和实例. 先上效果图 大部分做传统BS 的同学看到这个页面,脑海 ...