Files
frelay/ClientCore/ClientCore.cpp

291 lines
7.1 KiB
C++
Raw Normal View History

2025-06-16 23:41:35 +08:00
#include "ClientCore.h"
2025-06-14 23:25:16 +08:00
#include <QDebug>
ClientCore::ClientCore(QObject* parent) : QObject(parent)
{
}
void ClientCore::Instance()
{
// qDebug() << "Instance() thread:" << QThread::currentThread();
socket_ = new QTcpSocket(this);
connect(socket_, &QTcpSocket::readyRead, this, &ClientCore::onReadyRead);
connect(socket_, &QTcpSocket::disconnected, this, &ClientCore::onDisconnected);
2025-06-14 23:25:16 +08:00
}
ClientCore::~ClientCore()
{
}
bool ClientCore::SendFrame(QSharedPointer<FrameBuffer> frame)
{
return Send(frame);
}
void ClientCore::DoConnect(const QString& ip, quint16 port)
{
// qDebug() << "doConnect thread:" << QThread::currentThread();
emit connecting();
if (!Connect(ip, port)) {
emit conFailed();
return;
}
emit conSuccess();
}
2025-06-14 23:25:16 +08:00
bool ClientCore::Connect(const QString& ip, quint16 port)
{
if (connected_) {
qInfo() << QString(tr("already connected."));
return true;
}
2025-06-14 23:25:16 +08:00
socket_->connectToHost(ip, port);
if (!socket_->waitForConnected(3000)) {
qCritical() << QString(tr("%1:%2 connect failed...")).arg(ip).arg(port);
return false;
}
qInfo() << QString(tr("%1:%2 connected success.")).arg(ip).arg(port);
connected_ = true;
2025-06-14 23:25:16 +08:00
return true;
}
void ClientCore::Disconnect()
{
2025-06-20 14:39:03 +08:00
QMutexLocker locker(&conMutex_);
if (socket_ && socket_->state() != QAbstractSocket::UnconnectedState) {
socket_->disconnectFromHost();
if (socket_->state() != QAbstractSocket::UnconnectedState) {
socket_->waitForDisconnected(1000);
}
}
connected_ = false;
2025-06-14 23:25:16 +08:00
}
2025-06-14 23:44:13 +08:00
void ClientCore::onReadyRead()
{
QByteArray data = socket_->readAll();
recvBuffer_.append(data);
while (true) {
auto frame = Protocol::ParseBuffer(recvBuffer_);
if (frame == nullptr) {
break;
}
UseFrame(frame);
}
}
void ClientCore::onDisconnected()
{
connected_ = false;
qCritical() << QString("You [%1] disconnected...").arg(ownID_);
emit sigDisconnect();
2025-06-14 23:44:13 +08:00
}
void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
{
switch (frame->type) {
case FrameBufferType::FBT_SER_MSG_ASKCLIENTS: {
InfoClientVec info = infoUnpack<InfoClientVec>(frame->data);
emit sigClients(info);
break;
}
case FrameBufferType::FBT_SER_MSG_YOURID: {
ownID_ = frame->data;
GlobalData::Ins()->SetLocalID(ownID_);
qInfo() << QString(tr("own id: %1")).arg(ownID_);
emit sigYourId(frame);
break;
}
2025-06-15 23:13:30 +08:00
case FrameBufferType::FBT_CLI_ANS_DIRFILE: {
DirFileInfoVec info = infoUnpack<DirFileInfoVec>(frame->data);
emit sigFiles(info);
2025-06-15 23:13:30 +08:00
break;
}
case FrameBufferType::FBT_CLI_ASK_DIRFILE: {
DirFileInfoVec vec;
InfoMsg info = infoUnpack<InfoMsg>(frame->data);
if (!localFile_.GetDirFile(info.msg, vec)) {
qWarning() << QString(tr("get dir file failed use %1")).arg(info.msg);
return;
}
if (!Send<DirFileInfoVec>(vec, FBT_CLI_ANS_DIRFILE, frame->fid)) {
qCritical() << QString(tr("send dir file result failed."));
return;
}
break;
}
case FrameBufferType::FBT_CLI_ASK_HOME: {
InfoMsg info;
info.msg = Util::GetUserHome();
if (!Send<InfoMsg>(info, FBT_CLI_ANS_HOME, frame->fid)) {
qCritical() << QString(tr("send home failed."));
return;
}
break;
}
case FrameBufferType::FBT_CLI_ANS_HOME: {
InfoMsg info = infoUnpack<InfoMsg>(frame->data);
qInfo() << QString(tr("home: %1")).arg(info.msg);
emit sigPath(info.msg);
2025-06-15 23:13:30 +08:00
break;
}
case FrameBufferType::FBT_SER_MSG_FORWARD_FAILED: {
2025-06-20 10:33:03 +08:00
qCritical() << QString(tr("*** forward failed. fid:%1, tid:%2, type:%3"))
.arg(frame->fid)
.arg(frame->tid)
.arg(static_cast<uint32_t>(frame->type));
break;
}
case FrameBufferType::FBT_CLI_REQ_SEND: {
emit sigReqSend(frame);
break;
}
case FrameBufferType::FBT_CLI_REQ_DOWN: {
emit sigReqDown(frame);
break;
}
case FrameBufferType::FBT_CLI_TRANS_DONE: {
2025-06-19 22:07:12 +08:00
emit sigTransDone(frame);
break;
}
case FrameBufferType::FBT_CLI_CAN_SEND: {
2025-06-19 22:07:12 +08:00
emit sigCanSend(frame);
break;
}
case FrameBufferType::FBT_CLI_CANOT_SEND: {
2025-06-19 22:07:12 +08:00
emit sigCanotSend(frame);
break;
}
case FBT_CLI_CANOT_DOWN: {
2025-06-19 22:07:12 +08:00
emit sigCanotDown(frame);
break;
}
case FBT_CLI_CAN_DOWN: {
2025-06-19 22:07:12 +08:00
emit sigCanDown(frame);
break;
}
case FBT_CLI_FILE_BUFFER: {
2025-06-19 22:07:12 +08:00
emit sigFileBuffer(frame);
break;
}
case FBT_CLI_TRANS_FAILED: {
2025-06-19 22:07:12 +08:00
emit sigTransFailed(frame);
break;
}
2025-06-20 09:45:39 +08:00
case FBT_CLI_FILE_INFO: {
emit sigFileInfo(frame);
break;
}
2025-10-20 16:40:52 +08:00
case FBT_SER_MSG_OFFLINE: {
emit sigOffline(frame);
break;
}
default:
qCritical() << QString("unknown frame type: %1").arg(frame->type);
break;
}
2025-06-14 23:44:13 +08:00
}
bool ClientCore::Send(QSharedPointer<FrameBuffer> frame)
{
if (frame == nullptr) {
return false;
}
auto data = Protocol::PackBuffer(frame);
if (data.size() == 0) {
return false;
}
return Send(data.constData(), data.size());
}
bool ClientCore::Send(const char* data, qint64 len)
{
if (socket_->state() != QAbstractSocket::ConnectedState) {
qCritical() << QString("client %1 not connected...").arg(remoteID_);
return false;
}
2025-06-17 11:48:13 +08:00
qint64 bytesWritten = -1;
{
QMutexLocker locker(&sockMut_);
bytesWritten = socket_->write(data, len);
}
2025-06-14 23:44:13 +08:00
if (bytesWritten == -1 || !socket_->waitForBytesWritten(5000)) {
qCritical() << QString("Send data to server failed. %1").arg(socket_->errorString());
return false;
}
return true;
}
2025-06-15 14:31:54 +08:00
2025-06-25 17:06:30 +08:00
bool ClientCore::IsConnect()
{
return connected_;
}
2025-06-15 14:31:54 +08:00
void ClientCore::SetRemoteID(const QString& id)
{
GlobalData::Ins()->SetRemoteID(id);
2025-06-15 23:13:30 +08:00
remoteID_ = id;
2025-06-15 14:31:54 +08:00
}
QString ClientCore::GetRemoteID()
{
return remoteID_;
}
2025-06-18 14:53:56 +08:00
QString ClientCore::GetOwnID()
{
return ownID_;
}
SocketWorker::SocketWorker(ClientCore* core, QObject* parent) : QThread(parent), core_(core)
{
// connect(core_, &ClientCore::sigDisconnect, this, [this]() {
// thread()->quit();
// });
}
SocketWorker::~SocketWorker()
{
}
void SocketWorker::run()
{
core_->Instance();
exec();
}
2025-06-25 17:06:30 +08:00
HeatBeat::HeatBeat(ClientCore* core, QObject* parent) : QThread(parent), core_(core)
{
}
HeatBeat::~HeatBeat()
{
Stop();
}
void HeatBeat::Stop()
{
isRun_ = false;
}
void HeatBeat::run()
{
isRun_ = true;
InfoMsg info;
auto frame = core_->GetBuffer(info, FBT_SER_MSG_HEARTBEAT, "");
while (isRun_) {
QThread::sleep(1);
if (!core_->IsConnect()) {
continue;
}
ClientCore::syncInvoke(core_, frame);
2025-10-20 16:40:52 +08:00
auto rid = core_->GetRemoteID();
if (rid.isEmpty()) {
2025-06-25 17:06:30 +08:00
continue;
}
2025-10-20 16:40:52 +08:00
auto frame2 = core_->GetBuffer(info, FBT_SER_MSG_JUDGE_OTHER_ALIVE, rid);
ClientCore::syncInvoke(core_, frame2);
2025-06-25 17:06:30 +08:00
}
2025-10-20 16:40:52 +08:00
}