客户端:
#include "client.h"
#include "ui_client.h"
#include
Client::Client(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Client)
{
ui->setupUi(this);
//初始化创建的socket对象
msocket = new QTcpSocket();
recvsize = 0;
filesize = 0;
//连接服务器
QString ip = "192.168.199.93";
msocket->connectToHost(ip,6789); //连接固定的服务器
//接收服务器发来的数据
connect(msocket,SIGNAL(readyRead()),this,SLOT(read_data()));
//当链接服务器成功的时候会发送connected信号,并向服务器发送接收到的文件名和文件大小
//connect(msocket, SIGNAL(connected()),this, SLOT(send_filename_size()));
//成功接收一段数据会信号通知
connect(msocket,SIGNAL(bytesRead(qint64)),this, SLOT(send_file_content()));
}
Client::~Client()
{
delete ui;
}
//接收数据槽函数
void Client::read_data()
{
if(filesize == 0) //先接收文件名和文件大小
{
//创建流对象与套接字绑定
QDataStream stream(msocket);
QString name;
stream.setVersion(QDataStream::Qt_5_4);
stream>>filesize>>name;
qDebug()<<filesize<<name;
//设置进度条最大值
ui->progressBar->setMaximum(filesize);
ui->progressBar->setValue(0);
file.setFileName(name);
int flag = file.open(QIODevice::WriteOnly);
}
else //接收内容
{
if(recvsize < filesize)
{
qDebug()<<"1";
QByteArray array = msocket->readAll();
file.write(array);
recvsize += array.size();
//设置进度条
ui->progressBar->setValue(recvsize);
}
if(recvsize == filesize)
{
file.close();
filesize = 0;
recvsize = 0;
msocket->close();
}
}
}
服务器:
#include "server.h"
#include "ui_server.h"
#include //数据流
Server::Server(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Server)
{
ui->setupUi(this);
//初始化服务器对象
mserver = new QTcpServer();
//初始化客户端
msocket = new QTcpSocket();
//监听,需要ip地址和端口号
mserver->listen(QHostAddress::Any,6789); //定义固定的端口号
//关联新的客户端链接信号
connect(mserver,SIGNAL(newConnection()),this,SLOT(new_client()));
}
Server::~Server()
{
delete ui;
}
void Server::new_client() //证明有客户端已经连接成功
{
qDebug()<<"新客户端链接";
msocket = mserver->nextPendingConnection();
msocket->write("hello");
}
void Server::on_pushButton_2_clicked() //浏览文件按钮
{
QString filepath = QFileDialog::getOpenFileName(this);
ui->filepathEdit->setText(filepath);
}
void Server::on_pushButton_clicked() //发送按钮
{
//先发送文件名和文件大小以及通知
//2.发送文件名, 文件大小
QString filepath = ui->filepathEdit->text();
QFileInfo info(filepath);
//a.获取文件名
QString name = info.fileName();
//b.获取文件大小
quint64 size = info.size();
qDebug()<<name<<size; //输出文件名和文件大小
QByteArray array;
//定义个数据流绑定array
QDataStream stream(&array,QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_5_4);
//把数据通过流形式存入到array中
stream<<size<<name;
//打开文件
file.setFileName(filepath);
bool flag = file.open(QIODevice::ReadOnly);
if(!flag)
{
qDebug()<<"open fail";
return ;
}
//把发送字节数清空0
sendsize = 0;
//设置进度条的最大值
ui->progressBar->setMaximum(size);
//发送文件大小,文件名
msocket->write(array);//当对方收到数据后msocket会发送已经发送了多字节数据的信号
//成功发送一段数据会信号通知
connect(msocket,SIGNAL(bytesWritten(qint64)),this, SLOT(send_file_content()));
}
void Server::send_file_content()
{
//发送文件内容
if(file.isOpen()) //文件打开了,发送文件内容
{
QByteArray array = file.read(SIZE);
msocket->write(array);
sendsize += array.size();
ui->progressBar->setValue(sendsize);
qDebug()<<sendsize;
if(file.atEnd())
{
//关闭文件
file.close();
}
}
}