-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfiletranser.cpp
143 lines (119 loc) · 3.63 KB
/
filetranser.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "filetranser.h"
filetranser::filetranser(QObject *parent) : QObject(parent)
{
socket = new QTcpSocket();
connect(socket, SIGNAL(readyRead()), this, SLOT(onReadReady()));
connect(socket, SIGNAL(connected()), this, SLOT(onConnected()));
connect(socket, SIGNAL(disconnected()), this, SLOT(onDisConnected()));
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)));
socket->connectToHost("192.168.81.1",6000);
}
void filetranser::sendFile(const QString &filename)
{
// 读取到的文件
QByteArray datafileContent;
QFile file(filename);
if(!file.open(QIODevice::ReadOnly))
{
qDebug() << "文件打开失败";
return;
}
datafileContent = file.readAll();
file.close();
// 要发送的数据包
QByteArray dataSend;
QDataStream stream(&dataSend, QIODevice::WriteOnly);
stream <<quint32() << (quint32)MsgTypeFile << filename << datafileContent;
stream.device()->seek(0);
stream << dataSend.size();
socket->write(dataSend);
}
void filetranser::sendDeleteFile(const QString &file)
{
// 要发送的数据包
QByteArray dataSend;
QDataStream stream(&dataSend, QIODevice::WriteOnly);
stream <<quint32() << (quint32)MsgTypeDel<< file;
stream.device()->seek(0);
stream << dataSend.size();
socket->write(dataSend);
}
void filetranser::sendRenameFile(const QString &file1, const QString &file2)
{
QByteArray dataSend;
QDataStream stream(&dataSend, QIODevice::WriteOnly);
stream <<quint32() << (quint32)MsgTypeRename<< file1 << file2;
stream.device()->seek(0);
stream << dataSend.size();
socket->write(dataSend);
}
void filetranser::onConnected()
{
qDebug() << "客户端连接服务器成功.";
}
void filetranser::onDisConnected()
{
qDebug() << "服务器端连接断开.";
if(socket == 0)
return;
socket->close();
}
void filetranser::onError(QAbstractSocket::SocketError socketError)
{
qDebug() << "服务器端连接发生错误.";
}
void filetranser::onReadReady()
{
// 可以得到是谁触发了这个槽函数
QObject* obj = this->sender();
QTcpSocket* socket = qobject_cast<QTcpSocket*>(obj);
qint64 sizeNow = 0;
do
{
sizeNow = socket->bytesAvailable(); // 这个函数可以获取当前数据包的大小
QDataStream stream(socket);
if(LastsizePack == 0)
{
if(sizeNow < sizeof(quint32))
{
// 如果还没有包头长的话直接返回
return;
}
stream >> LastsizePack; // 当前包的大小, 注意这里不一定等于缓存区中数据的大小
}
if(sizeNow >= LastsizePack - 4) // 可以读了
{
LastsizePack = 0;
quint32 msg;
stream >> msg;
sizeNow = socket->bytesAvailable();
switch (msg)
{
case MsgTypeFile:
{
QByteArray datafilecontent;
stream >> datafilecontent;
break;
}
case MsgTypeDel:
{
QString filedel;
stream >> filedel;
break;
}
case MsgTypeRename:
{
QString file1;
QString file2;
stream >> file1 >> file2;
break;
}
default:
break;
}
}
else
return;
}
while(sizeNow > 0);
}