64,683
社区成员
发帖
与我相关
我的任务
分享
#include "UpdateServeThread.h"
#include <QTcpSocket>
#include <QTimer>
#include "MsgGlobal.h"
#include <QDataStream>
#include <QDateTime>
#include <QMutexLocker>
#include <QHostInfo>
#include<QtDebug>
UpdateServeThread::UpdateServeThread(int socketDescriptor,QObject *parent)
: QThread(parent),m_socketDescriptor(socketDescriptor)
,m_socket(nullptr)
,m_state(None)
,m_updateCount(0)
,m_timer(nullptr)
{
start();
QThread::wait(50);
}
void UpdateServeThread::run()
{
QTcpSocket _socket;
m_socket = &_socket;
_socket.setSocketDescriptor(m_socketDescriptor);
QTimer _timer;
_timer.setInterval(0);
m_timer = &_timer;
connect(&_timer,SIGNAL(timeout()),this,SLOT(checkUpdate()),Qt::DirectConnection);
connect(this,SIGNAL(startTimerSignal()),&_timer,SLOT(start()));
connect(this,SIGNAL(closeTimerSignal()),&_timer,SLOT(stop()));
connect(&_socket,SIGNAL(disconnected()),this,SIGNAL(disconnected()));
connect(&_socket,SIGNAL(socketError()),this,SIGNAL(socketError()));
exec();
}
UpdateServeThread::~UpdateServeThread()
{
}
void UpdateServeThread::checkUpdate()
{
QMutexLocker _locker(&m_mutex);
switch(m_state)
{
case None://向客户端发送更新邀请
{ qDebug()<<m_socket->size();
if(m_files.size())
{
auto _file = m_files.last();
QByteArray _byte0;
QDataStream _s(&_byte0,QIODevice::WriteOnly);
_s << _file.size();
_s << _file.fileName();
_s << UpdateCmd;
/* _s << _file.lastModified();
_s << 512;*/
qDebug()<< _file.size();
qDebug() << _file.fileName();
_byte0.resize(512);
m_socket->write(_byte0);
m_state = WaitCmdResult;
qDebug()<<"发起更新申请";
}
}break;
case WaitCmdResult://等待接收客户端邀请回复
{ qDebug()<<m_socket->size()<<"1111";
if(m_socket->size() == 512 && m_socket->isReadable())
{ qDebug()<<"222";
QByteArray _byte1 = m_socket->read(512);
QDataStream _stream(_byte1);
bool _update = true;
int _type = 0;
_stream >> _type;
_stream >> _update;
if(_type == UpdateCmdResult && _update)
{
m_currentFile.setFileName(m_files.last().absoluteFilePath());
m_currentFile.open(QIODevice::ReadOnly);
qDebug()<<"接收到更新确认,开始更新";
m_state = Update;
}
}
}break;
case Update://开始更新
{
QByteArray _byte3 = m_currentFile.read(512); //每次读取数据大小
m_socket->write(_byte3);
/*m_currentFile.seek(m_currentFile.pos() + 1024);*/
if(m_currentFile.atEnd())
{
m_currentFile.close();
m_state = OverSend ;
emit updateProecessChange(m_updateCount-m_files.size(),m_updateCount);
m_files.pop_back();
if(m_files.isEmpty())
{
qDebug()<<"所有文件发送完成";
emit updateProecessChange(1,1);
m_timer->stop();
}
}
}break;
case OverSend :
{
qDebug()<<m_socket->size()<<"等待结束";
QByteArray _over1 = m_socket->read(512);
QDataStream _OverSend(_over1);
int _over = 0;
_OverSend >> _over;
if (_over == recvOver)
{
m_state = None ;
}
}break;
}
}
void UpdateServeThread::setUpdate(const QList<QFileInfo> &files)
{
QMutexLocker _locker(&m_mutex);
m_files = files;
m_updateCount = files.size();
m_state = None;
if(m_updateCount)
emit startTimerSignal();
else
emit closeTimerSignal();
}
QString UpdateServeThread::clientName() const
{
return QHostInfo::fromName(m_socket->peerAddress().toString()).hostName();
}
在线坐等分析~!!
求解决方案啊~! 现在没任何思绪,都不知道问题在哪里,知道问题在哪里就好了,我就能对症下药了;~!#include "UpdateServeThread.h"
#include <QTcpSocket>
#include <QTimer>
#include "MsgGlobal.h"
#include <QDataStream>
#include <QDateTime>
#include <QMutexLocker>
#include <QHostInfo>
#include<QtDebug>
UpdateServeThread::UpdateServeThread(int socketDescriptor,QObject *parent)
: QThread(parent),m_socketDescriptor(socketDescriptor)
,m_socket(nullptr)
,m_state(None)
,m_updateCount(0)
,m_timer(nullptr)
{
start();
QThread::wait(50);
}
void UpdateServeThread::run()
{
QTcpSocket _socket;
m_socket = &_socket;
_socket.setSocketDescriptor(m_socketDescriptor);
QTimer _timer;
_timer.setInterval(0);
m_timer = &_timer;
connect(&_timer,SIGNAL(timeout()),this,SLOT(checkUpdate()),Qt::DirectConnection);
connect(this,SIGNAL(startTimerSignal()),&_timer,SLOT(start()));
connect(this,SIGNAL(closeTimerSignal()),&_timer,SLOT(stop()));
connect(&_socket,SIGNAL(disconnected()),this,SIGNAL(disconnected()));
connect(&_socket,SIGNAL(socketError()),this,SIGNAL(socketError()));
exec();
}
UpdateServeThread::~UpdateServeThread()
{
}
void UpdateServeThread::checkUpdate()
{
QMutexLocker _locker(&m_mutex);
switch(m_state)
{
case None://向客户端发送更新邀请
{ qDebug()<<m_socket->size();
if(m_files.size())
{
auto _file = m_files.last();
QByteArray _byte0;
QDataStream _s(&_byte0,QIODevice::WriteOnly);
_s << _file.size();
_s << _file.fileName();
_s << UpdateCmd;
/* _s << _file.lastModified();
_s << 512;*/
qDebug()<< _file.size();
qDebug() << _file.fileName();
_byte0.resize(512);
m_socket->write(_byte0);
m_state = WaitCmdResult;
qDebug()<<"发起更新申请";
}
}break;
case WaitCmdResult://等待接收客户端邀请回复
{ qDebug()<<m_socket->size()<<"1111";
if(m_socket->size() == 512 && m_socket->isReadable())
{ qDebug()<<"222";
QByteArray _byte1 = m_socket->read(512);
QDataStream _stream(_byte1);
bool _update = true;
int _type = 0;
_stream >> _type;
_stream >> _update;
if(_type == UpdateCmdResult && _update)
{
m_currentFile.setFileName(m_files.last().absoluteFilePath());
m_currentFile.open(QIODevice::ReadOnly);
qDebug()<<"接收到更新确认,开始更新";
m_state = Update;
}
}
}break;
case Update://开始更新
{
QByteArray _byte3 = m_currentFile.read(512); //每次读取数据大小
m_socket->write(_byte3);
/*m_currentFile.seek(m_currentFile.pos() + 1024);*/
if(m_currentFile.atEnd())
{
m_currentFile.close();
m_state = OverSend ;
emit updateProecessChange(m_updateCount-m_files.size(),m_updateCount);
m_files.pop_back();
if(m_files.isEmpty())
{
qDebug()<<"所有文件发送完成";
emit updateProecessChange(1,1);
m_timer->stop();
}
}
}break;
case OverSend :
{
qDebug()<<m_socket->size()<<"等待结束";
QByteArray _over1 = m_socket->read(512);
QDataStream _OverSend(_over1);
int _over = 0;
_OverSend >> _over;
if (_over == recvOver)
{
m_state = None ;
}
}break;
}
}
void UpdateServeThread::setUpdate(const QList<QFileInfo> &files)
{
QMutexLocker _locker(&m_mutex);
m_files = files;
m_updateCount = files.size();
m_state = None;
if(m_updateCount)
emit startTimerSignal();
else
emit closeTimerSignal();
}
QString UpdateServeThread::clientName() const
{
return QHostInfo::fromName(m_socket->peerAddress().toString()).hostName();
}
贴了,发送端的,你看下吧?不知道是线程问题还是 文件已经被打开,下一个客户端在连接时候再次打开文件产生了冲突还是?