选择文件点击发送以后,进度条长时间不动
请问是哪里出问题
widgt.cpp
void Widget::hasPendingFile(QString userName,QString serverAddress, //接收文件
QString clientAddress,QString fileName)
{
QString ipAddress = getIP();
if(ipAddress == clientAddress)
{
int btn = QMessageBox::information(this,tr("接受文件"),
tr("来自%1(%2)的文件:%3,是否接收?")
.arg(userName).arg(serverAddress).arg(fileName),
QMessageBox::Yes,QMessageBox::No);
if(btn == QMessageBox::Yes)
{
QString name = QFileDialog::getSaveFileName(0,tr("保存文件"),fileName);
if(!name.isEmpty())
{
TcpClient *client = new TcpClient(this);
client->setFileName(name);
client->setHostAddress(QHostAddress(serverAddress));
client->show();
}
}
else{
sendMessage(Refuse,serverAddress);
}
}
}
void Widget::on_sendfile_clicked()//发送文件按钮槽函数
{
if(ui->tableWidget->selectedItems().isEmpty())
{
QMessageBox::warning(0,tr("选择用户"),tr("请先从用户列表选择要传送的用户!"),QMessageBox::Ok);
return;
}
server->show();
server->initServer();
}
tcpclient.cpp
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()<<bytesReceived<<"received"<<TotalBytes;
double speed = bytesReceived / useTime;
ui->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(); //接收完文件后,一定要关闭,不然可能出问题
}
}
tcpserver.cpp
void TcpServer::sendMessage() //开始发送数据
{
ui->serverSendBtn->setEnabled(false);
clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection,SIGNAL(bytesWritten(qint64)),SLOT(updateClientProgress(qint64)));
ui->serverStatusLabel->setText(tr("开始传送文件 %1 !").arg(theFileName));
localFile = new QFile(fileName);
if(!localFile->open((QFile::ReadOnly))){//以只读方式打开
QMessageBox::warning(this,tr("应用程序"),tr("无法读取文件 %1:\n%2").arg(fileName).arg(localFile->errorString()));
return;
}
TotalBytes = localFile->size();
QDataStream sendOut(&outBlock,QIODevice::WriteOnly);
sendOut.setVersion(QDataStream::Qt_4_6);
time.start(); //开始计时
QString currentFile = fileName.right(fileName.size() - fileName.lastIndexOf('/')-1);
sendOut<<qint64(0)<<qint64(0)<<currentFile;
TotalBytes += outBlock.size();
sendOut.device()->seek(0);
sendOut<<TotalBytes<<qint64((outBlock.size()-sizeof(qint64)*2));
bytesToWrite = TotalBytes - clientConnection->write(outBlock);
qDebug()<<currentFile<<TotalBytes;
outBlock.resize(0);
}
void TcpServer::updateClientProgress(qint64 numBytes)//更新进度条
{
bytesWritten += (int)numBytes;
if(bytesToWrite > 0){
outBlock = localFile->read(qMin(bytesToWrite,loadSize));
bytesToWrite -= (int)clientConnection->write(outBlock);
outBlock.resize(0);
}
else{
localFile->close();
}
ui->progressBar->setMaximum(TotalBytes);
ui->progressBar->setValue(bytesWritten);
float useTime = time.elapsed();
double speed = bytesWritten / useTime;
ui->serverStatusLabel->setText(tr("已发送 %1MB (%2MB/s) \n共%3MB 已用时:%4秒\n估计剩余时间:%5秒")
.arg(bytesWritten / (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));//剩余时间
//num.sprintf("%.1f KB/s", (bytesWritten*1000) / (1024.0*time.elapsed()));
if(bytesWritten == TotalBytes)
ui->serverStatusLabel->setText(tr("传送文件 %1 成功").arg(theFileName));
}
void TcpServer::on_serverOpenBtn_clicked() //打开
{
fileName = QFileDialog::getOpenFileName(this);
if(!fileName.isEmpty())
{
theFileName = fileName.right(fileName.size() - fileName.lastIndexOf('/')-1);
ui->serverStatusLabel->setText(tr("要传送的文件为:%1 ").arg(theFileName));
ui->serverSendBtn->setEnabled(true);
ui->serverOpenBtn->setEnabled(false);
}
}
void TcpServer::refused() //被对方拒绝
{
tcpServer->close();
ui->serverStatusLabel->setText(tr("对方拒绝接收!!!"));
}
void TcpServer::on_serverSendBtn_clicked() //发送
{
if(!tcpServer->listen(QHostAddress::Any,tcpPort))//开始监听
{
qDebug() << tcpServer->errorString();
close();
return;
}
ui->serverStatusLabel->setText(tr("等待对方接收... ..."));
emit sendFileName(theFileName);
}
void TcpServer::on_serverCloseBtn_clicked()//退出
{
if(tcpServer->isListening())
{
tcpServer->close();
clientConnection->abort();
}
this->close();
}
void TcpServer::initServer()//初始化
{
loadSize = 4*1024;
TotalBytes = 0;
bytesWritten = 0;
bytesToWrite = 0;
ui->serverStatusLabel->setText(tr("请选择要传送的文件"));
ui->progressBar->reset();
ui->serverOpenBtn->setEnabled(true);
ui->serverSendBtn->setEnabled(false);
tcpServer->close();
}