-
Notifications
You must be signed in to change notification settings - Fork 2
/
tcp_receiver.cpp
93 lines (85 loc) · 3.65 KB
/
tcp_receiver.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
#include "tcp_receiver.h"
tcp_receiver::tcp_receiver()
{
this->total_bytes = this->bytes_received = this->file_name_size = 0;
connect(&this->tcp_server, SIGNAL(newConnection()), this, SLOT(accept_connection()));
}
void tcp_receiver::start()
{
this->bytes_received = 0;
if (!this->tcp_server.listen(QHostAddress::LocalHost, 8888)) {
qDebug() << this->tcp_server.errorString();
this->tcp_server.close();
return;
}
}
void tcp_receiver::accept_connection()
{
this->connection_socket = this->tcp_server.nextPendingConnection();
connect(this->connection_socket, SIGNAL(readyRead()), this, SLOT(receive_username()));
connect(this->connection_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(display_error(QAbstractSocket::SocketError)));
// this->tcp_server.close();
}
void tcp_receiver::display_error(QAbstractSocket::SocketError socket_error)
{
qDebug() << "ooooooooooooooooooooooooo" << connection_socket->errorString();
connection_socket->close();
}
void tcp_receiver::receive_username()
{
this->username.clear();
this->username = this->connection_socket->readLine();
qDebug() << "received user name:" << this->username;
this->send_confirm_username();
}
void tcp_receiver::send_confirm_username()
{
qDebug() << "sending confirm user name";
this->connection_socket->write(this->username.toAscii(), this->username.length());
disconnect(this->connection_socket, SIGNAL(readyRead()), this, SLOT(receive_username()));
connect(this->connection_socket, SIGNAL(readyRead()), this, SLOT(receive()));
this->connection_socket->waitForReadyRead(10000);
receive();
}
void tcp_receiver::clean_up()
{
this->total_bytes = this->bytes_received = this->file_name_size = 0;
}
void tcp_receiver::receive()
{
qDebug() << "in receive";
QDataStream in(this->connection_socket);
if(this->bytes_received <= sizeof(qint64) * 2) { //如果接收到的数据小于16个字节,那么是刚开始接收数据,我们保存到来的头文件信息
if((this->connection_socket->bytesAvailable() >= sizeof(qint64) * 2) && (this->file_name_size == 0)) { //接收数据总大小信息和文件名大小信息
in >> this->total_bytes >> this->file_name_size;
qDebug() << this->total_bytes;
qDebug() << this->file_name_size;
this->bytes_received += sizeof(qint64) * 2;
}
if((this->connection_socket->bytesAvailable() >= this->file_name_size) && (this->file_name_size != 0)) { //接收文件名,并建立文件
in >> this->file_path;
qDebug() << this->file_path;
this->bytes_received += this->file_name_size;
this->local_file = new QFile(this->file_path);
if(!this->local_file->open(QFile::WriteOnly)) {
qDebug() << "open file error!";
return;
}
} else return;
}
if(this->bytes_received < this->total_bytes) { //如果接收的数据小于总数据,那么写入文件
this->bytes_received += this->connection_socket->bytesAvailable();
this->in_block = this->connection_socket->readAll();
this->local_file->write(this->in_block);
this->in_block.resize(0);
}
if(this->bytes_received == this->total_bytes) { //接收数据完成时
// this->connection_socket->close();
this->local_file->close();
clean_up();
qDebug() << "img received done!";
emit img_received(this->local_file->fileName());
disconnect(this->connection_socket, SIGNAL(readyRead()), this, SLOT(receive()));
connect(this->connection_socket, SIGNAL(readyRead()), this, SLOT(receive_username()));
}
}