唯心唯力 2017-10-14 05:08 采纳率: 0%
浏览 1794

Qt5网络tcp协议,服务器发送文件,客户端接收文件,为什么客户端接收的文件大小是0kb

客户端:
#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();
}
}

}

  • 写回答

1条回答 默认 最新

  • threenewbee 2017-10-14 15:47
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘