功能:
1.提供登录界面(客户端)
2.服务器端用数据库来存储用户名和密码
3.注册时客户端将注册信息发送给服务器端,并进行验证,如果注册名可用,添加进数据库并返回客户端添加成功信息。
4.登录时客户端将登录信息发送给服务器端进行验证,服务端返回验证结果。
待添加:
1.服务器端并发功能实现
#include "tcpclient.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TcpClient w;
w.setWindowTitle("Client");
w.show();
return a.exec();
}
#ifndef TCPCLIENT_H
#define TCPCLIENT_H
#include
#include
#include
namespace Ui {
class TcpClient;
}
class TcpClient : public QMainWindow
{
Q_OBJECT
public:
explicit TcpClient(QWidget *parent = 0);
~TcpClient();
protected:
void init();
void connectServer();
private slots:
void on_sendBtn_clicked();
void displayError(QAbstractSocket::SocketError);
void on_signBtn_clicked();
void readMessages();
private:
Ui::TcpClient *ui;
QTcpSocket *tcpSocket;
};
#endif // TCPCLIENT_H
注意:如果客户端连接服务器后想接着给服务器发送信息
则下面这句话要接在连接服务器语句后,不能放在init函数里,不然无法给服务器发送数据。
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessages()));
#include "tcpclient.h"
#include "ui_tcpclient.h"
#define ip "192.168.1.165"
#define port 8000
TcpClient::TcpClient(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::TcpClient)
{
ui->setupUi(this);
ui->passwardLineEdit->setEchoMode(QLineEdit::Password); //密码方式显示文本
init();
connectServer();
}
TcpClient::~TcpClient()
{
delete ui;
}
void TcpClient::init()
{
tcpSocket=new QTcpSocket(this);
connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),
this,SLOT(displayError(QAbstractSocket::SocketError))); //发生错误时执行displayError函数
}
void TcpClient::connectServer()
{
tcpSocket->abort(); //取消已有的连接
tcpSocket->connectToHost(ip,port);
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessages()));
}
void TcpClient::on_sendBtn_clicked()
{
QString userName=ui->userLineEdit->text();
QString passward=ui->passwardLineEdit->text();
if(userName=="" || passward=="")
QMessageBox::information(this,"警告","输入不能为空",QMessageBox::Ok);
QString bs="b";
QString data=bs+"#"+userName+"#"+passward;
tcpSocket->write(data.toLatin1());
}
void TcpClient::on_signBtn_clicked()
{
QString userName=ui->userLineEdit->text();
QString passward=ui->passwardLineEdit->text();
if(userName=="" || passward=="")
QMessageBox::information(this,"警告","输入不能为空",QMessageBox::Ok);
QString as="a";
QString data=as+"#"+userName+"#"+passward;
tcpSocket->write(data.toLatin1());
}
void TcpClient::displayError(QAbstractSocket::SocketError)
{
qDebug()<errorString(); //输出出错信息
}
void TcpClient::readMessages()
{
QString data=tcpSocket->readAll();
QStringList list=data.split("#");
if(list[0]=="a" && list[1]=="true")
QMessageBox::information(this,"信息提示","注册成功!",QMessageBox::Ok);
else if(list[0]=="a" && list[1]=="false")
QMessageBox::information(this,"信息提示","注册失败,用户名已经被注册!",QMessageBox::Ok);
else if(list[0]=="b" && list[1]=="true")
QMessageBox::information(this,"信息提示","登录成功!",QMessageBox::Ok);
else if(list[0]=="b" && list[1]=="false")
QMessageBox::information(this,"信息提示","登录失败,用户名或密码错误!",QMessageBox::Ok);
else
return;
}
客户端界面如下:
#include "tcpserver.h"
#include
#include "mysql.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MySql ms;
ms.initsql();
TcpServer w;
w.setWindowTitle("Server");
w.show();
return a.exec();
}
#ifndef MYSQL_H
#define MYSQL_H
#include
#include
#include
#include
class MySql
{
public:
MySql();
void initsql();
void createtable();
bool loguser(QString name,QString passward);
bool signup(QString name,QString passward);
private:
QSqlQuery *query;
};
#endif // MYSQL_H
注意:下面这句话并不能创建数据库,只能连接已有数据库,因此创建数据库必须在mysql里面用create database User来完成。
db.setDatabaseName("User");
#include "mysql.h"
MySql::MySql()
{
}
void MySql::initsql()
{
QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setUserName("root");
db.setPassword("");
db.setDatabaseName("User");
if(db.open())
{
qDebug()<<"Database connected successfully!";
createtable();
return;
}
else
{
qDebug()<<"Database connected failed!";
return;
}
}
void MySql::createtable()
{
query=new QSqlQuery;
query->exec("create table user(name VARCHAR(30) PRIMARY KEY UNIQUE NOT NULL,passward VARCHAR(30))");
/*创建root用户*/
query->exec("insert into user value('root', 'root')");
}
bool MySql::loguser(QString name, QString passward)
{
QString str=QString("select * from user where name='%1' and passward='%2'").arg(name).arg(passward);
query=new QSqlQuery;
query->exec(str);
query->last();
int record=query->at()+1;
if(record==0)
return false;
return true;
}
bool MySql::signup(QString name,QString passward)
{
QString str=QString("select * from user where name='%1").arg(name);
query=new QSqlQuery;
query->exec(str);
query->last();
int record=query->at()+1;
if(record!=0)
return false;
str=QString("insert into user value('%1','%2')").arg(name).arg(passward);
bool ret=query->exec(str);
return ret;
}
#ifndef TCPSERVER_H
#define TCPSERVER_H
#include
#include
#include
namespace Ui {
class TcpServer;
}
class TcpServer : public QMainWindow
{
Q_OBJECT
public:
explicit TcpServer(QWidget *parent = 0);
~TcpServer();
bool checkSignIn(QString name,QString passward);
bool checkSignUp(QString name,QString passward);
protected:
void init(); // 初始化函数用于完成一些诸如信号与槽之间的联系和变量初始化工作
private slots:
void on_startBtn_clicked();
void acceptConnection();
void receiveData();
void displayError(QAbstractSocket::SocketError);
private:
Ui::TcpServer *ui;
QTcpSocket *tcpSocket;
QTcpServer *tcpServer;
QTimer *timer;
};
#endif // TCPSERVER_H
#include "tcpserver.h"
#include "ui_tcpserver.h"
#include "mysql.h"
TcpServer::TcpServer(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::TcpServer)
{
ui->setupUi(this);
init();
}
TcpServer::~TcpServer()
{
delete ui;
}
void TcpServer::init()
{
this->tcpServer=new QTcpServer(this);
this->tcpSocket=new QTcpSocket(this);
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),
this,SLOT(displayError(QAbstractSocket::SocketError)));
}
void TcpServer::receiveData()
{
QString data=tcpSocket->readAll();
QStringList list=data.split("#");
bool ret=0;
if(list[0]=="a") //注册
ret=checkSignUp(list[1],list[2]);
else if(list[0]=="b") //登录
ret=checkSignIn(list[1],list[2]);
else
return;
QString sendData=list[0];
if(ret)
sendData+="#true";
else
sendData+="#false";
tcpSocket->write(sendData.toLatin1());
}
void TcpServer::on_startBtn_clicked()
{
ui->startBtn->setEnabled(false);
if(!tcpServer->listen(QHostAddress::Any,8000))
{
qDebug()<errorString();
close();
return;
}
}
void TcpServer::acceptConnection()
{
tcpSocket=tcpServer->nextPendingConnection();
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(receiveData())); //**********
}
void TcpServer::displayError(QAbstractSocket::SocketError)
{
qDebug()<errorString();
tcpSocket->close();
}
bool TcpServer::checkSignIn(QString name,QString passward)
{
MySql *mysql=new MySql();
bool ret=mysql->loguser(name,passward);
return ret;
}
bool TcpServer::checkSignUp(QString name, QString passward)
{
MySql *mysql=new MySql();
bool ret=mysql->signup(name,passward);
return ret;
}
完整文件下载:https://github.com/onlyou2030/SignIn-SignUp