fix:接收端未检测到发送端断连的情况处理。处理传输退出功能。
This commit is contained in:
@@ -212,6 +212,7 @@ void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
|
||||
break;
|
||||
}
|
||||
case FBT_SER_MSG_OFFLINE: {
|
||||
popID(frame->fid);
|
||||
emit sigOffline(frame);
|
||||
break;
|
||||
}
|
||||
@@ -227,6 +228,10 @@ void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
|
||||
emit sigFlowBack(frame);
|
||||
break;
|
||||
}
|
||||
case FBT_CLI_TRANS_INTERRUPT: {
|
||||
emit sigTransInterrupt(frame);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
qCritical() << QString("未知的帧类型: %1").arg(frame->type);
|
||||
break;
|
||||
@@ -285,6 +290,20 @@ QString ClientCore::GetOwnID()
|
||||
return ownID_;
|
||||
}
|
||||
|
||||
void ClientCore::pushID(const QString& id)
|
||||
{
|
||||
QWriteLocker locker(&rwIDLock_);
|
||||
if (!remoteIDs_.contains(id)) {
|
||||
remoteIDs_.push_back(id);
|
||||
}
|
||||
}
|
||||
|
||||
void ClientCore::popID(const QString& id)
|
||||
{
|
||||
QWriteLocker locker(&rwIDLock_);
|
||||
remoteIDs_.removeAll(id);
|
||||
}
|
||||
|
||||
SocketWorker::SocketWorker(ClientCore* core, QObject* parent) : QThread(parent), core_(core)
|
||||
{
|
||||
// connect(core_, &ClientCore::sigDisconnect, this, [this]() {
|
||||
@@ -328,10 +347,17 @@ void HeatBeat::run()
|
||||
}
|
||||
ClientCore::syncInvoke(core_, frame);
|
||||
auto rid = core_->GetRemoteID();
|
||||
if (rid.isEmpty()) {
|
||||
continue;
|
||||
if (!rid.isEmpty()) {
|
||||
auto frame2 = core_->GetBuffer(info, FBT_SER_MSG_JUDGE_OTHER_ALIVE, rid);
|
||||
ClientCore::syncInvoke(core_, frame2);
|
||||
}
|
||||
|
||||
{
|
||||
QReadLocker loker(&core_->rwIDLock_);
|
||||
for (auto& id : core_->remoteIDs_) {
|
||||
auto frame3 = core_->GetBuffer(info, FBT_SER_MSG_JUDGE_OTHER_ALIVE, id);
|
||||
ClientCore::syncInvoke(core_, frame3);
|
||||
}
|
||||
}
|
||||
auto frame2 = core_->GetBuffer(info, FBT_SER_MSG_JUDGE_OTHER_ALIVE, rid);
|
||||
ClientCore::syncInvoke(core_, frame2);
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <QTcpSocket>
|
||||
#include <QThread>
|
||||
#include <array>
|
||||
#include <QReadWriteLock>
|
||||
|
||||
class ClientCore : public QObject
|
||||
{
|
||||
@@ -81,6 +82,7 @@ signals:
|
||||
void sigMsgAsk(QSharedPointer<FrameBuffer> frame);
|
||||
void sigMsgAnswer(QSharedPointer<FrameBuffer> frame);
|
||||
void sigFlowBack(QSharedPointer<FrameBuffer> frame);
|
||||
void sigTransInterrupt(QSharedPointer<FrameBuffer> frame);
|
||||
|
||||
signals:
|
||||
void conSuccess();
|
||||
@@ -99,10 +101,18 @@ public:
|
||||
void SetRemoteID(const QString& id);
|
||||
QString GetRemoteID();
|
||||
QString GetOwnID();
|
||||
void pushID(const QString& id);
|
||||
void popID(const QString& id);
|
||||
|
||||
public:
|
||||
QMutex conMutex_;
|
||||
QString ownID_;
|
||||
|
||||
// 这是被动发送时,对方ID。
|
||||
QReadWriteLock rwIDLock_;
|
||||
QVector<QString> remoteIDs_;
|
||||
|
||||
// 这是主动通信时的对方ID。
|
||||
QString remoteID_;
|
||||
|
||||
QMutex sockMut_;
|
||||
|
||||
@@ -69,8 +69,6 @@ void FileTrans::ReqSendFile(const TransTask& task)
|
||||
|
||||
void FileTrans::ReqDownFile(const TransTask& task)
|
||||
{
|
||||
// TODO: check if running...
|
||||
|
||||
// start
|
||||
InfoMsg info;
|
||||
info.toPath = task.localPath;
|
||||
@@ -163,6 +161,8 @@ void FileTrans::RegisterSignal()
|
||||
connect(clientCore_, &ClientCore::sigFileInfo, this, [this](QSharedPointer<FrameBuffer> frame) { fbtFileInfo(frame); });
|
||||
connect(clientCore_, &ClientCore::sigTransFailed, this, [this](QSharedPointer<FrameBuffer> frame) { fbtTransFailed(frame); });
|
||||
connect(clientCore_, &ClientCore::sigOffline, this, [this](QSharedPointer<FrameBuffer> frame) { fbtInterrupt(frame); });
|
||||
connect(clientCore_, &ClientCore::sigTransInterrupt, this,
|
||||
[this](QSharedPointer<FrameBuffer> frame) { fbtInterrupt(frame); });
|
||||
}
|
||||
|
||||
// The other party requests to send, prepare to receive.
|
||||
@@ -221,6 +221,9 @@ void FileTrans::fbtReqSend(QSharedPointer<FrameBuffer> frame)
|
||||
downTask_->file.close();
|
||||
return;
|
||||
}
|
||||
|
||||
// 需要记录对方的ID,用于心跳检测
|
||||
clientCore_->pushID(frame->fid);
|
||||
downTask_->state = TaskState::STATE_RUNNING;
|
||||
}
|
||||
|
||||
@@ -228,10 +231,6 @@ void FileTrans::fbtReqSend(QSharedPointer<FrameBuffer> frame)
|
||||
void FileTrans::fbtReqDown(QSharedPointer<FrameBuffer> frame)
|
||||
{
|
||||
InfoMsg info = infoUnpack<InfoMsg>(frame->data);
|
||||
// judge is same client's same file.
|
||||
|
||||
// judge if file exits etc.
|
||||
|
||||
// send
|
||||
auto doTask = QSharedPointer<DoTransTask>::create();
|
||||
doTask->file.setFileName(info.fromPath);
|
||||
@@ -261,6 +260,10 @@ void FileTrans::fbtReqDown(QSharedPointer<FrameBuffer> frame)
|
||||
doTask->task.isUpload = true;
|
||||
doTask->task.localPath = info.fromPath;
|
||||
doTask->task.remoteId = frame->fid;
|
||||
|
||||
// 需要记录对方的ID,用于心跳检测
|
||||
clientCore_->pushID(frame->fid);
|
||||
|
||||
SendFile(doTask);
|
||||
}
|
||||
|
||||
@@ -347,18 +350,43 @@ void FileTrans::fbtTransFailed(QSharedPointer<FrameBuffer> frame)
|
||||
downTask_->state = TaskState::STATE_FAILED;
|
||||
}
|
||||
|
||||
void FileTrans::fbtInterrupt(QSharedPointer<FrameBuffer> frame)
|
||||
void FileTrans::Interrupt(bool notic)
|
||||
{
|
||||
if (downTask_->state == TaskState::STATE_RUNNING) {
|
||||
qWarning() << QString(tr("传输文件 %1 中断。")).arg(downTask_->file.fileName());
|
||||
downTask_->file.close();
|
||||
|
||||
if (notic) {
|
||||
InfoMsg info;
|
||||
info.msg = QString(tr("传输文件 %1 主动中断。")).arg(downTask_->file.fileName());
|
||||
auto f = clientCore_->GetBuffer(info, FBT_CLI_TRANS_INTERRUPT, downTask_->task.remoteId);
|
||||
if (!ClientCore::syncInvoke(clientCore_, f)) {
|
||||
qCritical() << QString(tr("发送 %1 信息给 %2 失败。")).arg(info.msg).arg(downTask_->task.remoteId);
|
||||
}
|
||||
}
|
||||
|
||||
downTask_->state = TaskState::STATE_NONE;
|
||||
}
|
||||
if (sendTask_->state == TaskState::STATE_RUNNING) {
|
||||
qWarning() << QString(tr("传输文件 %1 中断。")).arg(sendTask_->file.fileName());
|
||||
sendTask_->file.close();
|
||||
|
||||
InfoMsg info;
|
||||
info.msg = QString(tr("传输文件 %1 主动中断。")).arg(sendTask_->file.fileName());
|
||||
auto f = clientCore_->GetBuffer(info, FBT_CLI_TRANS_INTERRUPT, sendTask_->task.remoteId);
|
||||
if (!ClientCore::syncInvoke(clientCore_, f)) {
|
||||
qCritical() << QString(tr("发送 %1 信息给 %2 失败。")).arg(info.msg).arg(sendTask_->task.remoteId);
|
||||
}
|
||||
|
||||
sendTask_->state = TaskState::STATE_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
void FileTrans::fbtInterrupt(QSharedPointer<FrameBuffer> frame)
|
||||
{
|
||||
Interrupt(false);
|
||||
}
|
||||
|
||||
void FileTrans::SendFile(const QSharedPointer<DoTransTask>& task)
|
||||
{
|
||||
auto* sendThread = new SendThread(clientCore_);
|
||||
@@ -387,7 +415,6 @@ void SendThread::run()
|
||||
isSuccess_ = true;
|
||||
delay_ = 0;
|
||||
bool invokeSuccess = false;
|
||||
qInfo() << tr("开始发送文件:") << task_->file.fileName();
|
||||
while (!task_->file.atEnd()) {
|
||||
auto frame = QSharedPointer<FrameBuffer>::create();
|
||||
frame->tid = task_->task.remoteId;
|
||||
@@ -414,12 +441,16 @@ void SendThread::run()
|
||||
// 关键点:这里不调用,无法中途收到别人发的数据。
|
||||
QCoreApplication::processEvents();
|
||||
}
|
||||
qInfo() << tr("结束发送文件:") << task_->file.fileName();
|
||||
InfoMsg info;
|
||||
auto f = cliCore_->GetBuffer(info, FBT_CLI_TRANS_DONE, task_->task.remoteId);
|
||||
ClientCore::syncInvoke(cliCore_, f);
|
||||
task_->file.close();
|
||||
task_->state = TaskState::STATE_FINISH;
|
||||
qInfo() << QString(tr("结束发送文件:%1")).arg(task_->file.fileName());
|
||||
|
||||
// 不是Open表示被别人关闭了,就不发送结束信号了。
|
||||
if (task_->file.isOpen()) {
|
||||
InfoMsg info;
|
||||
auto f = cliCore_->GetBuffer(info, FBT_CLI_TRANS_DONE, task_->task.remoteId);
|
||||
ClientCore::syncInvoke(cliCore_, f);
|
||||
task_->file.close();
|
||||
task_->state = TaskState::STATE_FINISH;
|
||||
}
|
||||
}
|
||||
|
||||
void SendThread::setTask(const QSharedPointer<DoTransTask>& task)
|
||||
|
||||
@@ -71,6 +71,9 @@ public:
|
||||
qint32 GetSendProgress();
|
||||
qint32 GetDownProgress();
|
||||
|
||||
public:
|
||||
void Interrupt(bool notic);
|
||||
|
||||
private:
|
||||
void fbtReqSend(QSharedPointer<FrameBuffer> frame);
|
||||
void fbtReqDown(QSharedPointer<FrameBuffer> frame);
|
||||
|
||||
Reference in New Issue
Block a user