#include "tcpclient.h" #include "ui_tcpclient.h" #include #include /** * @brief TcpClient::TcpClient * @param parent */ TcpClient::TcpClient(QWidget *parent) : QDialog(parent), ui(new Ui::TcpClient) { ui->setupUi(this); this->setFixedSize(350,180); QPalette pal; QPixmap pixmap(":/images/background.jpg"); pal.setBrush(QPalette::Window,QBrush(pixmap)); setPalette(pal); TotalBytes = 0; bytesReceived = 0; fileNameSize = 0; tcpClient = new QTcpSocket(this); tcpPort = 6666; connect(tcpClient,SIGNAL(readyRead()),this,SLOT(readMessage())); connect(tcpClient,SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(displayError(QAbstractSocket::SocketError))); } TcpClient::~TcpClient() { delete ui; } void TcpClient::changeEvent(QEvent *e) { QDialog::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void TcpClient::setHostAddress(QHostAddress address) //设置服务器地址并连接服务器 { hostAddress = address; newConnect(); } void TcpClient::newConnect() { blockSize = 0; tcpClient->abort(); tcpClient->connectToHost(hostAddress,tcpPort); time.start(); } void TcpClient::readMessage() { QDataStream in(tcpClient); in.setVersion(QDataStream::Qt_4_6); float useTime = time.elapsed(); if(bytesReceived <= sizeof(qint64)*2){ if((tcpClient->bytesAvailable() >= sizeof(qint64)*2) && (fileNameSize == 0)){ in>>TotalBytes>>fileNameSize; bytesReceived += sizeof(qint64)*2; } if((tcpClient->bytesAvailable() >= fileNameSize) && (fileNameSize != 0)){ in>>fileName; bytesReceived +=fileNameSize; if(!localFile->open(QFile::WriteOnly)){ QMessageBox::warning(this,tr("应用程序"),tr("无法读取文件 %1:\n%2.").arg(fileName).arg(localFile->errorString())); return; } }else{ return; } } if(bytesReceived < TotalBytes){ bytesReceived += tcpClient->bytesAvailable(); inBlock = tcpClient->readAll(); localFile->write(inBlock); inBlock.resize(0); } ui->progressBar->setMaximum(TotalBytes); ui->progressBar->setValue(bytesReceived); qDebug()<tcpClientStatusLabel->setText(tr("已接收 %1MB (%2MB/s) \n共%3MB 已用时:%4秒\n估计剩余时间:%5秒") .arg(bytesReceived / (1024*1024))//已接收 .arg(speed*1000/(1024*1024),0,'f',2)//速度 .arg(TotalBytes / (1024 * 1024))//总大小 .arg(useTime/1000,0,'f',0)//用时 .arg(TotalBytes/speed/1000 - useTime/1000,0,'f',0));//剩余时间 if(bytesReceived == TotalBytes) { tcpClient->close(); ui->tcpClientStatusLabel->setText(tr("接收文件 %1 完毕").arg(fileName)); localFile->close(); //接收完文件后,一定要关闭,不然可能出问题 } } void TcpClient::displayError(QAbstractSocket::SocketError socketError) //错误处理 { switch(socketError) { case QAbstractSocket::RemoteHostClosedError : break; default : qDebug() << tcpClient->errorString(); } } void TcpClient::on_tcpClientCancleBtn_clicked() { tcpClient->abort(); } void TcpClient::on_tcpClientCloseBtn_clicked() { tcpClient->abort(); this->close(); }