gusucode.com > qt实现的多线程服务器和客户端源码程序 > qt实现的多线程服务器和客户端源码程序/qtserver/server/clientsocket.cpp

    #include <QtDebug>
#include <QtNetwork>
#include <QSqlQuery>

#include "clientsocket.h"

ClientSocket::ClientSocket(QObject *parent)
    : QTcpSocket(parent)
{
    connect(this, SIGNAL(readyRead()), this, SLOT(readClient()));
//    connect(this, SIGNAL(disconnected()), this, SLOT(deleteLater()));

    nextBlockSize = 0;
}

void ClientSocket::readClient()
{

    QDataStream in(this);
    in.setVersion(QDataStream::Qt_4_3);

    if (nextBlockSize == 0) {
        if (bytesAvailable() < sizeof(quint16))
            return;
        in >> nextBlockSize;
    }

    if (bytesAvailable() < nextBlockSize)
        return;

    quint8 requestType;
    QString sql;

    in >> requestType;
	switch(requestType){
		case 'L':{//login
			in >> sql;
			qDebug() << sql;
			bool s = checkLogin(sql);
		    QByteArray block;
		    QDataStream out(&block, QIODevice::WriteOnly);
		    out.setVersion(QDataStream::Qt_4_3);
			if (s){
				nextBlockSize = 0;
			    out << quint16(0) << QString("LTRUE");
//				disconnectFromHost();
//				close();
			}else{
				nextBlockSize = 0;
				out << quint16(0) << QString("LFALSE");
			}
			    out.device()->seek(0);
			    out << quint16(block.size() - sizeof(quint16));
			    write(block);
			out << quint16(0xFFFF);
//			out << quint16(0xFFFF);
			break;
		}
	}
}
bool ClientSocket::checkLogin(const QString &sql)
{
	QSqlQuery q;
	q.exec(sql);
	if (q.next())
	{
		if(q.value(0).toInt()>0)
			return true;
		else return false;
		q.clear();
	}
	return false;
}