/
tcpclient.cpp
125 lines (107 loc) · 3.45 KB
/
tcpclient.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "tcpclient.h"
#include "ui_tcpclient.h"
#include <QFileDialog>
#include <QMessageBox>
TcpClient::TcpClient(QWidget *parent) :
QDialog(parent),
ui(new Ui::TcpClient)
{
ui->setupUi(this);
this->setFixedSize(350,180);
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()<<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(); //接收完文件后,一定要关闭,不然可能出问题
}
}
void TcpClient::displayError(QAbstractSocket::SocketError socketError) //错误处理
{
switch(socketError)
{
case QAbstractSocket::RemoteHostClosedError : break;
default : qDebug() << tcpClient->errorString();
}
}
void TcpClient::on_tcpClientCloseBtn_clicked()//关闭
{
tcpClient->abort();
this->close();
}
void TcpClient::on_tcpClientCancleBtn_clicked()//取消
{
tcpClient->abort();
}