Connection::Connection(QObject *parent) : QTcpSocket(parent) { greetingMessage = tr("undefined"); username = tr("unknown"); state = Waiting; currentDataType = Undefined; numBytesForCurrentDataType = -1; transferTimerId = 0; isGreetingMessageSent = false; QObject::connect(this, SIGNAL(readyRead()), this, SLOT(processReadyRead())); QObject::connect(this, SIGNAL(connected()), this, SLOT(sendGreetingMessage())); QObject::connect(this, SIGNAL(connected()), this, SLOT(sendGreetingMessage())); }
void Connection::processReadyRead() { if (state == WaitingForGreeting) { if (!readProtocolHeader()) return; if (currentDataType != Greeting) { abort(); return; } state = ReadingGreeting; } if (state == ReadingGreeting) { if (!hasEnoughData()) return; buffer = read(numBytesForCurrentDataType); if (buffer.size() != numBytesForCurrentDataType) { abort(); return; } username = QString(buffer) + '@' + peerAddress().toString() + ':' + QString::number(peerPort()); currentDataType = Undefined; numBytesForCurrentDataType = 0; buffer.clear(); if (!isValid()) { abort(); return; } if (!isGreetingMessageSent) sendGreetingMessage(); pingTimer.start(); pongTime.start(); state = ReadyForUse; emit readyForUse(); } do { if (currentDataType == Undefined) { if (!readProtocolHeader()) return; } if (!hasEnoughData()) return; processData(); } while (bytesAvailable() > 0); }
Connection::Connection(Identity identity, QObject *parent ) : QTcpSocket(parent) { m_currentDataType = Undefined; m_transferTimerId = 0; m_numBytesForCurrentDataType = -1; m_identity = identity; m_buffer.clear(); QObject::connect(this, SIGNAL(readyRead()), this, SLOT(processReadyRead())); QObject::connect(this, SIGNAL(connected()), this, SLOT(sendGreetingMessage())); }
// ChatConnection初始化和信号槽连接 ChatConnection::ChatConnection(QObject *parent) : QTcpSocket(parent) { this->greetingMessage = QObject::tr("undefined"); this->userName = QObject::tr("unknown"); this->state = WaitingForGreeting; this->currentDataType = UNDEFINED; this->numBytesForCurrentDataType = -1; this->transferTimerId = 0; this->isGreetingMessageSent = false; connect(this, SIGNAL(readyRead()), this, SLOT(processReadyRead())); connect(this, SIGNAL(connected()), this, SLOT(sendGreetingMessage())); connect(this, SIGNAL(disconnected()), this, SLOT(handleDisconnected())); connect(this, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(handleSocketError(QAbstractSocket::SocketError))); }
Connection::Connection(QObject *parent) : QTcpSocket(parent) { greetingMessage = tr("undefined"); username = tr("unknown"); state = WaitingForGreeting; currentDataType = Undefined; numBytesForCurrentDataType = -1; transferTimerId = 0; isGreetingMessageSent = false; pingTimer.setInterval(PingInterval); QObject::connect(this, SIGNAL(readyRead()), this, SLOT(processReadyRead())); QObject::connect(this, SIGNAL(disconnected()), &pingTimer, SLOT(stop())); QObject::connect(&pingTimer, SIGNAL(timeout()), this, SLOT(sendPing())); QObject::connect(this, SIGNAL(connected()), this, SLOT(sendGreetingMessage())); }
void DkConnection::checkState() { if (mState == WaitingForGreeting) { if (mCurrentDataType != Greeting) { abort(); return; } if (!hasEnoughData()) return; mBuffer = read(mNumBytesForCurrentDataType); if (mBuffer.size() != mNumBytesForCurrentDataType) { abort(); return; } if (!isValid()) { abort(); return; } if (!mIsGreetingMessageSent) sendGreetingMessage(mCurrentTitle); mState = ReadyForUse; mPortOfPeer = peerPort(); // save peer port ... otherwise connections where this instance is server can not be removed from peerList readGreetingMessage(); mBuffer.clear(); mNumBytesForCurrentDataType = 0; mCurrentDataType = Undefined; return; } if (mState==ReadyForUse && mCurrentDataType == startSynchronize) { if (!hasEnoughData()) return; mBuffer = read(mNumBytesForCurrentDataType); if (mBuffer.size() != mNumBytesForCurrentDataType) { abort(); return; } QDataStream ds(mBuffer); QList<quint16> synchronizedPeersOfOtherInstance; quint16 numberOfSynchronizedPeers; ds >> numberOfSynchronizedPeers; //qDebug() << "other client is sychronized with: "; for (int i=0; i < numberOfSynchronizedPeers; i++) { quint16 peerId; ds >> peerId; synchronizedPeersOfOtherInstance.push_back(peerId); //qDebug() << peerId; } mCurrentDataType = Undefined; mNumBytesForCurrentDataType = 0; mBuffer.clear(); if (!isValid()) { abort(); return; } mState = Synchronized; if (!mIsSynchronizeMessageSent) sendStartSynchronizeMessage(); mSynchronizedTimer->stop(); emit connectionStartSynchronize(synchronizedPeersOfOtherInstance, this); return; } if (mState==Synchronized && mCurrentDataType == stopSynchronize) { mState=ReadyForUse; this->mIsSynchronizeMessageSent=false; emit connectionStopSynchronize(this); mBuffer = read(mNumBytesForCurrentDataType); if (mBuffer.size() != mNumBytesForCurrentDataType) { abort(); return; } mCurrentDataType = Undefined; mNumBytesForCurrentDataType = 0; mBuffer.clear(); return; } if (mCurrentDataType == GoodBye) { //qDebug() << "received GoodBye from " << peerAddress() << ":" << peerPort(); emit connectionGoodBye(this); mCurrentDataType = Undefined; mNumBytesForCurrentDataType = 0; mBuffer.clear(); abort(); return; } }