QT中基于TCP的client和server

实现功能

多人在线聊天室,类似于咱们的QQ群,通过usr表记录注册过的用户,online表记录当前在线的用户

先放效果图

客户端连接成功

在这里插入图片描述注册用户
在这里插入图片描述登陆成功
在这里插入图片描述聊天

在这里插入图片描述用户退出
在这里插入图片描述更新数据库

代码顺序:

server

1.tcpser.h
2.tcpser.cpp

client

1.chat_box.h
2.login.h ----------------------------需要修改连接的ip和端口号
3.chat_box.cpp
4.login.cpp

----------------------------------tcpser.h----------------------------------

#ifndef TCPSER_H
#define TCPSER_H


#include <QObject>
#include <QDebug>
#include <QTcpServer>
#include <QTcpSocket>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QByteArray>
#include <QFile>
#include <QList>
#include <QTimer>

class TcpSer : public QObject
{
    Q_OBJECT
public:
    explicit TcpSer(QObject *parent = nullptr);

    void start(void);

signals:

public slots:
    void net_accpet();
    void net_read();
//    void update_online_count();
private:
    QTcpServer *tcpser;
    QTcpSocket *client;    //当前响应的client
    QList <QTcpSocket*> online_clientlist;
    int usr_id = 0;
    int online_id = 0;
};

#endif // TCPSER_H
----------------------------------tcpser.cpp----------------------------------

#include "tcpser.h"

TcpSer::TcpSer(QObject *parent) : QObject(parent)
{
    //创建数据库
    QSqlDatabase mydb = QSqlDatabase::addDatabase("QSQLITE");

    mydb.setDatabaseName("user.db");  //设置数据库的名字

    bool ok = mydb.open(); //打开数据库,不存在则创建
    if(!ok){
        qDebug()<<"open database failed";
    }

    //创建usr表
    QString sql = "create table if not exists usr (ID text,name text,passwd text,status text)";

    QSqlQuery query;

    ok = query.exec(sql);
    if(!ok){
        qDebug()<<"create table failed";
    }

    //创建在线用户表
    QString sql1 = "create table if not exists online (ID text,name text,ip text,port text)";

    QSqlQuery query1;

    ok = query1.exec(sql1);
    if(!ok){
        qDebug()<<"create table failed";
    }

    tcpser = new QTcpServer(this);
    tcpser->listen(QHostAddress("0.0.0.0"),8080);

    connect(tcpser,SIGNAL(newConnection()),this,SLOT(net_accpet()));//连接请求时执行

    //    QTimer *timer = new QTimer(this);
    //    //定时检查更新设备的网络状态
    //    connect(timer,SIGNAL(timeout()),this,SLOT(update_online_count()));
    //    timer->start(30000);


}


//void TcpSer::update_online_count()
//{
//    QString text = "###online_num";
//    QString online_num = QString::number(online_clientlist.size());
//    text.append(online_num);
//    client->write(text.toStdString().c_str());             // 发送在线人数
//}

void TcpSer::net_accpet()
{
    client = tcpser->nextPendingConnection();//建立连接

    QHostAddress cli_ip = client->peerAddress();

    quint16 cli_port = client->peerPort();

    QString ip = cli_ip.toString();
    QString port = QString::number(cli_port);

    qDebug()<<"connect a client ip:"<<ip<<" "<<"port"<<port;




    connect(client,SIGNAL(readyRead()),this,SLOT(net_read()));
}


void TcpSer::net_read()
{

    //由于多个client关联net_read
    //找到对应的发送者client
    this->sender();
    QTcpSocket *tcpclient = dynamic_cast<QTcpSocket*>(sender());
    client = tcpclient;


    //读取到client的数据
    QString data = QString(tcpclient->readAll());


    QStringList list;
    QString name,passwd,status;

    list = data.split("4tGkOMIzweAbPxrF");
    int ret = list.size();


    if(ret == 3)
    {

        //登陆
        name = list[0];
        passwd = list[1];
        status = list[2];      //'0'---离线     '1'---在线

        //数据库是否有该用户并且处于离线状态
        QString sql = QString("select * from usr where name='%1' and passwd='%2' and status='%3'").arg(name,passwd,status);
        QSqlQuery query;

        bool ok = query.exec(sql);

        if(!ok)
        {
            qDebug()<<"登陆验证:查询失败";
        }
        else
        {
            qDebug()<<"登陆验证:查询成功";

            bool ok =  query.next();

            if(!ok)
            {
                //定位失败   无该用户或者该用户已登陆
                qDebug()<<"无该用户或者该用户已登陆,登陆失败";
                QString data = "###login false";
                QByteArray ba;
                ba.append(data);
                char *c = ba.data();

                client->write(c);
            }
            else
            {
                //数据库有用户并且处于离线状态
                status = '1';
                QString sql = QString("update usr set status='%2' where name='%1'").arg(name,status);

                QSqlQuery query;

                bool ok = query.exec(sql);
                if(!ok)
                {
                    qDebug()<<"登陆更新:失败";
                }
                else
                {
                    qDebug()<<"登陆更新:成功";
                    //获取用户 ip port

                    QHostAddress cli_ip = client->peerAddress();
                    quint16 cli_port = client->peerPort();

                    QString ip = cli_ip.toString();
                    QString port = QString::number(cli_port);

                    QString data = "###login success";
                    QByteArray ba;
                    ba.append(data);
                    char *c = ba.data();
                    client->write(c);

                    online_clientlist.append(client);   //放入容器



                    qDebug()<<"ip:"<<ip<<" "<<"port:"<<port<<"登陆成功";

                    //记录在线用户
                    ++online_id;
                    QString ip2 = cli_ip.toString();
                    QString port2 = QString::number(cli_port);
                    QString ID = QString::number(online_id);

                    sql = QString("insert into online values ('%1','%2','%3','%4')").arg(ID,name,ip2,port2);
                    QSqlQuery query;

                    bool ok = query.exec(sql);
                    if(!ok)
                    {
                        --online_id;
                        qDebug()<<"插入新在线用户失败";
                    }
                    else
                    {
                        qDebug()<<"插入新在线用户成功";
                    }

                    //                    QString text = "###online_num";
                    //                    QString online_num = QString::number(online_clientlist.size());
                    //                    text.append(online_num);
                    //                    client->write(text.toStdString().c_str());             // 发送在线人数
                }
            }
        }
    }
    if(ret == 2)
    {
        //注册

        //判断数据库是否存在该用户名
        name = list[0];
        passwd = list[1];
        status = "0";

        QString sql = QString("select * from usr where name='%1'").arg(name);
        QSqlQuery query;

        bool ok = query.exec(sql);
        if(!ok)
        {
            qDebug()<<"查询失败";
        }
        if(ok)
        {
            qDebug()<<"查询成功";

            bool ok = query.next();
            if(!ok)
            {
                //用户不存在,注册新用户
                ++usr_id;
                QString ID = QString::number(usr_id);
                QString sql = QString("insert into usr values ('%1','%2','%3','%4')").arg(ID,name,passwd,status);
                QSqlQuery query;

                bool ok = query.exec(sql);

                if(!ok)
                {
                    qDebug()<<"执行插入失败";
                    --usr_id;
                }
                else
                {
                    qDebug()<<"用户不存在";
                    qDebug()<<"执行插入成功";

                    const char *ch = "###registration success";
                    client->write(ch);

                }

            }
            else
            {
                //用户存在
                qDebug()<<"用户存在";
                QString data = "###registration false";
                QByteArray ba;
                ba.append(data);
                const char *c = ba.data();

                client->write(c);
            }

        }

    }
    if(ret == 1)
    {
        //对话
        QString data1 = data;
        QString data2 = data;
        QString data3 = data;
        QString data4 = data;
        QString data5 = data;
//        QString data6 = data;

        QString text1 = data1.mid(0,22);
        QString text2 = data2.mid(0,13);
        QString text3 = data3.mid(0,14);
        QString text4 = data4.mid(0,9);
        QString text5 = data5.mid(0,15);
//        QString text6 = data6.mid(0,16);

        if(text1 == "###super administrator")
        {
            //超级管理员发布消息<=========>server

            for(int i = 0;i < online_clientlist.size();i++)
            {
                QString super_data;
                super_data = data.replace("###super administrator","");
                online_clientlist.at(i)->write(super_data.toStdString().c_str());
            }
        }

        else if(text2 == "###i will off")
        {

            for(int i = 0;i < online_clientlist.size();i++)
            {
                if(online_clientlist.at(i) == client)
                {
                    //client断开连接 对应status置0
                    //--->根据socket找到对应的ip port-->再根据 ip port 查online中对应的name--->删除在线用户数据库中的对应用户--->然后再将usr中name对应的
                    QHostAddress cli_ip = online_clientlist.at(i)->peerAddress();
                    quint16 cli_port = online_clientlist.at(i)->peerPort();

                    QString ip = cli_ip.toString();
                    QString port = QString::number(cli_port);

                    QString sql = QString("select * from online where ip='%1' and port='%2'").arg(ip,port);

                    QSqlQuery query;

                    bool ok = query.exec(sql);
                    if(!ok)
                    {
                        qDebug()<<"client断开 查找online失败";
                    }
                    else
                    {
                        query.next();
                        QString name = query.value(1).toString();

                        QString status = "0";
                        QString sql = QString("update usr set status='%2' where name='%1'").arg(name,status);

                        QSqlQuery query;
                        bool ok = query.exec(sql);
                        if(!ok)
                        {
                            qDebug()<<"client断开usr更新失败";
                        }
                        else
                        {
                            QString off_ip,off_port;
                            off_ip = ip;
                            off_port = port;

                            qDebug()<<"client off "<<"ip:"<<off_ip<<" "<<"port:"<<off_port;

                            //将该用户从在线表中移除



                            QString sql = QString("delete from online where name='%1'").arg(name);

                            QSqlQuery query;
                            bool ok = query.exec(sql);
                            if(!ok)
                            {
                                qDebug()<<"在线表更新失败";
                            }
                            else
                            {
                                qDebug()<<"在线表更新成功";
                            }

                            QString data = "###Timeout detection";
                            online_clientlist.at(i)->write(data.toStdString().c_str());

                            //                            online_clientlist.at(i)->deleteLater();
                            //                            qDebug()<<online_clientlist.size();

                            online_clientlist.removeAt(i);
                        }
                    }
                }
            }
        }
        else if(text3 == "####i will off")
        {

            for(int i = 0;i < online_clientlist.size();i++)
            {
                if(online_clientlist.at(i) == client)
                {
                    //client断开连接 对应status置0
                    //--->根据socket找到对应的ip port-->再根据 ip port 查online中对应的name--->删除在线用户数据库中的对应用户--->然后再将usr中name对应的
                    QHostAddress cli_ip = online_clientlist.at(i)->peerAddress();
                    quint16 cli_port = online_clientlist.at(i)->peerPort();

                    QString ip = cli_ip.toString();
                    QString port = QString::number(cli_port);

                    QString sql = QString("select * from online where ip='%1' and port='%2'").arg(ip,port);

                    QSqlQuery query;

                    bool ok = query.exec(sql);
                    if(!ok)
                    {
                        qDebug()<<"client断开 查找online失败";
                    }
                    else
                    {
                        query.next();
                        QString name = query.value(1).toString();

                        QString status = "0";
                        QString sql = QString("update usr set status='%2' where name='%1'").arg(name,status);

                        QSqlQuery query;
                        bool ok = query.exec(sql);
                        if(!ok)
                        {
                            qDebug()<<"client断开usr更新失败";
                        }
                        else
                        {
                            QString off_ip,off_port;
                            off_ip = ip;
                            off_port = port;

                            qDebug()<<"client off "<<"ip:"<<off_ip<<" "<<"port:"<<off_port;

                            //将该用户从在线表中移除
                            QString sql = QString("delete from online where name='%1'").arg(name);

                            QSqlQuery query;
                            bool ok = query.exec(sql);
                            if(!ok)
                            {
                                qDebug()<<"在线表更新失败";
                            }
                            else
                            {
                                qDebug()<<"在线表更新成功";
                            }

                            online_clientlist.removeAt(i);
                            qDebug()<<"当前在线用户数量:"<<online_clientlist.size();
                        }
                    }
                }
            }
        }
        else if(text4 == "###update")
        {
            QString text = "###online_num";
            QString online_num = QString::number(online_clientlist.size());
            text.append(online_num);
            for(int i = 0;i < online_clientlist.size();i++)
            {
                online_clientlist.at(i)->write(text.toStdString().c_str());             // 发送在线人数
            }

        }
        else if(text5 == "#####i will off")
        {
            for(int i = 0;i < online_clientlist.size();i++)
            {
                if(online_clientlist.at(i) == client)
                {
                    //client断开连接 对应status置0
                    //--->根据socket找到对应的ip port-->再根据 ip port 查online中对应的name--->删除在线用户数据库中的对应用户--->然后再将usr中name对应的
                    QHostAddress cli_ip = online_clientlist.at(i)->peerAddress();
                    quint16 cli_port = online_clientlist.at(i)->peerPort();

                    QString ip = cli_ip.toString();
                    QString port = QString::number(cli_port);

                    QString sql = QString("select * from online where ip='%1' and port='%2'").arg(ip,port);

                    QSqlQuery query;

                    bool ok = query.exec(sql);
                    if(!ok)
                    {
                        qDebug()<<"client断开 查找online失败";
                    }
                    else
                    {
                        query.next();
                        QString name = query.value(1).toString();

                        QString status = "0";
                        QString sql = QString("update usr set status='%2' where name='%1'").arg(name,status);

                        QSqlQuery query;
                        bool ok = query.exec(sql);
                        if(!ok)
                        {
                            qDebug()<<"client断开usr更新失败";
                        }
                        else
                        {
//                            QString off_ip,off_port;
//                            off_ip = ip;
//                            off_port = port;

//                            qDebug()<<"client off "<<"ip:"<<off_ip<<" "<<"port:"<<off_port;

                            //将该用户从在线表中移除
                            QString sql = QString("delete from online where name='%1'").arg(name);

                            QSqlQuery query;
                            bool ok = query.exec(sql);
                            if(!ok)
                            {
                                qDebug()<<"在线表更新失败";
                            }
                            else
                            {
                                qDebug()<<"在线表更新成功";
                            }

                            online_clientlist.removeAt(i);
                            qDebug()<<"当前在线用户数量:"<<online_clientlist.size();

                            QString text = "###online_num";
                            QString online_num = QString::number(online_clientlist.size());
                            text.append(online_num);
                            for(int i = 0;i < online_clientlist.size();i++)
                            {
                                online_clientlist.at(i)->write(text.toStdString().c_str());             // 发送在线人数
                            }
                        }
                    }
                }
            }
        }
        else
        {
            for(int i = 0;i < online_clientlist.size();i++)
            {
                if(online_clientlist.at(i) == client)   //其中一个在线client发送消息   判断等于自己 查表获取自己的name
                {
                    QHostAddress c_ip = online_clientlist.at(i)->peerAddress();
                    quint16 c_port = online_clientlist.at(i)->peerPort();

                    QString chat_ip = c_ip.toString();
                    QString chat_port = QString::number(c_port);
                    QString data1 = data;
                    qDebug()<<"ip:"<<chat_ip<<" "<<"port:"<<chat_port<<"speak:"<<data1;
                }
                else
                {
                    //查表寻找该client的name
                    QHostAddress c_ip = client->peerAddress();    //当前的
                    quint16 c_port = client->peerPort();

                    QString chat_ip = c_ip.toString();
                    QString chat_port = QString::number(c_port);

                    QString sql = QString("select * from online where ip='%1' and port='%2'").arg(chat_ip,chat_port);

                    QSqlQuery query;

                    bool ok = query.exec(sql);
                    if(!ok)
                    {
                        qDebug()<<"查找该client的name失败";
                    }
                    else
                    {
                        query.next();
                        QString name = query.value(1).toString();
                        QString client_chat = name;
                        client_chat.append(":");
                        client_chat.append(data);
                        online_clientlist.at(i)->write(client_chat.toStdString().c_str());

                    }

                }
            }
        }

    }
}

void TcpSer::start()
{
    qDebug()<<"Server start";
}
----------------------------------chat_box.h----------------------------------

#ifndef CHAT_BOX_H
#define CHAT_BOX_H

#include <QWidget>
#include <QTcpSocket>
#include <QAction>
#include <QByteArray>
#include <QTextCodec>
#include <QCloseEvent>
#include "login.h"
#include <QDebug>



namespace Ui {
class chat_box;
}

class chat_box : public QWidget
{
    Q_OBJECT

public:
    explicit chat_box(QWidget *parent = 0);
    ~chat_box();
    void client_socket(QTcpSocket* c_socket);

protected:
     void closeEvent(QCloseEvent *);

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void tcp_recv();
    void on_pushButton_3_clicked();

signals:
    void cbox_close();

private:
    Ui::chat_box *ui;
    QTcpSocket *socket;
};

#endif // CHAT_BOX_H

----------------------------------login.h----------------------------------
//# pragma execution_character_set("utf-8")
#ifndef LOGIN_H
#define LOGIN_H


#include <QWidget>
#include <QTcpSocket>
#include <QLineEdit>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QTimer>

#include "chat_box.h"

namespace Ui {
class login;
}

class login : public QWidget
{
    Q_OBJECT

public:
    explicit login(QWidget *parent = 0);
    ~login();
    QTcpSocket* c_socket();
protected:
     void closeEvent(QCloseEvent *);
private slots:
    void on_pushButton_2_clicked();

    void on_pushButton_clicked();
    void login_clear();
    void Login_verification();
    void zc_verification();
    void back_login();

//    void open_socket();
//    void paintEvent(QPaintEvent *event);

    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

private:
    Ui::login *ui;
    QTcpSocket *socket;
    QString name = NULL;
    QString passwd = NULL;


};

#endif // LOGIN_H

----------------------------------chat_box.cpp----------------------------------

#include "chat_box.h"
#include "ui_chat_box.h"

chat_box::chat_box(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::chat_box)
{
    ui->setupUi(this);

    this->setWindowIcon(QIcon(":/icon/chat.png"));
    this->setWindowTitle("WeChat");
    this->setFixedSize(592,414);

    connect(ui->lineEdit,SIGNAL(returnPressed()),ui->pushButton,SIGNAL(clicked()), Qt::UniqueConnection);


}


void chat_box::closeEvent(QCloseEvent *)
{
    //在退出窗口之前,实现希望做的操作
    QString data = "####i will off";
    socket->write(data.toStdString().c_str());
    socket->disconnectFromHost();

}
void chat_box::client_socket(QTcpSocket *c_socket)
{
    socket = c_socket;
    connect(socket,SIGNAL(readyRead()),this,SLOT(tcp_recv()));
}

void chat_box::tcp_recv()
{

    char buf[40960] = {0};
    memset(buf,0,sizeof(buf));
    QString data;


    socket->read(buf,sizeof(buf));
    data = QString(buf);

    QString data1 = data;
    QString data2 = data;
    QString data3 = data;

    QString text1 = data1.mid(0,20);
    QString text2 = data2.mid(0,22);
    QString text3 = data3.mid(0,13);

    if(text1 == "###Timeout detection")
    {
        socket->disconnectFromHost();

        this->close();

    }
    else if(text2 == "###super administrator")
    {
        QString server_data = "server:";
        QString server = data.replace("###super administrator","");
        server_data.append(server);
        ui->textEdit->append(server_data);
    }
    else if(text3 == "###online_num")
    {
        ui->textEdit_2->clear();
        QString num = data.replace("###online_num","");
        QString count = "当前在线人数:";
        count.append(num);
        ui->textEdit_2->insertPlainText(count);
        ui->textEdit_2->setAlignment(Qt::AlignCenter);
    }
    else
    {
        ui->textEdit->append(data);
    }

}


void chat_box::on_pushButton_2_clicked()
{
    //返回login界面
    emit cbox_close();
    this->close();
}

void chat_box::on_pushButton_clicked()
{
    //发送
    QString data = ui->lineEdit->text();

    ui->textEdit->setReadOnly(true);

    ui->textEdit->append(data);
    socket->write(data.toStdString().c_str());
    ui->lineEdit->clear();

}

chat_box::~chat_box()
{
    delete ui;
}

void chat_box::on_pushButton_3_clicked()
{
    //关闭
    QString data = "###i will off";
    socket->write(data.toStdString().c_str());
}

----------------------------------login.cpp----------------------------------

#include "login.h"
#include "ui_login.h"

login::login(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::login)
{
    ui->setupUi(this);
    this->setWindowTitle("Login");
    this->setWindowIcon(QIcon(":/icon/login.png"));
    this->setFixedSize(414,302);
    ui->pushButton_2->setFocus();
    ui->pushButton_2->setShortcut(QKeySequence::InsertParagraphSeparator);
    ui->pushButton_2->setShortcut(Qt::Key_Enter);  //小键盘Enter
    ui->pushButton_2->setShortcut(Qt::Key_Return);  //大键盘Enter


    socket = new QTcpSocket(this);
    //    socket->connectToHost("***.***.***.***",***);   //连接   你的服务器ip和端口   eg:192.168.56.15 8888

}

login::~login()
{
    delete ui;
}


QTcpSocket* login::c_socket()
{
    QTcpSocket *c_socket = socket;

    return c_socket;
}

void login::on_pushButton_2_clicked()
{
    //登陆
    QString name =  ui->lineEdit->text();
    QString passwd = ui->lineEdit_2->text();         //获取用户名和密码
    QString status = "0";
    if(NULL == name)
    {
        QMessageBox::critical(this,"警告","用户名为空",QMessageBox::No,QMessageBox::No);
        return;
    }
    if(NULL == passwd)
    {
        QMessageBox::critical(this,"警告","密码为空",QMessageBox::No,QMessageBox::No);
        return;
    }
    /*******发送给服务器*******/

    QString sql;


    sql.append(name);
    sql.append("4tGkOMIzweAbPxrF");
    sql.append(passwd);
    sql.append("4tGkOMIzweAbPxrF");
    sql.append(status);
    socket->write(sql.toStdString().c_str());

    connect(socket,SIGNAL(readyRead()),this,SLOT(Login_verification()));

}

void login::Login_verification()
{

    char buf[16] = {0};

    socket->read(buf,sizeof(buf));

    QString data = QString(buf);
    QString data1 = data.mid(0,16);



    if(data1 == "###login success")
    {
        /*******如果服务器返回true,则登陆成功启动聊天框*******/
        chat_box *cbox = new chat_box;
        cbox->show();
        QString update = "###update";
        socket->write(update.toStdString().c_str());

        cbox->client_socket(this->c_socket());

        connect(cbox,SIGNAL(cbox_close()),this,SLOT(show()));         //chat窗口关闭返回login
        connect(cbox,SIGNAL(cbox_close()),this,SLOT(login_clear()));
        connect(cbox,SIGNAL(cbox_close()),this,SLOT(back_login()));

        this->hide();      //隐藏login
    }
    else if(data1 == "###login false")
    {
        QMessageBox::about(this," ","登陆失败");
    }
    disconnect(socket,SIGNAL(readyRead()),this,SLOT(Login_verification()));
}





void login::on_pushButton_clicked()
{
    //注册
    name = ui->lineEdit->text();
    passwd = ui->lineEdit_2->text();           //获取用户名和密码
    if(NULL == name)
    {
        QMessageBox::critical(this,"警告","用户名为空",QMessageBox::No,QMessageBox::No);
        return;
    }
    if(NULL == passwd)
    {
        QMessageBox::critical(this,"警告","密码为空",QMessageBox::No,QMessageBox::No);
        return;
    }

    /*******发送给服务器*******/
    QString data;
    data.append(name);
    data.append("4tGkOMIzweAbPxrF");
    data.append(passwd);
    QByteArray ba;
    ba.append(data);
    const char *c = ba.data();
    socket->write(c);

    connect(socket,SIGNAL(readyRead()),this,SLOT(zc_verification()));

}

void login::zc_verification()
{
    /*******判断注册成功与否*******/
    //接收返回值
    char buf[24] = {0};
    socket->read(buf,sizeof(buf));

    QString data = QString(buf);
    QString data1 = data.mid(0,24);

    if(data1 == "###registration success")
    {
        /*******注册成功提示*******/
        QMessageBox::about(this,"注册消息","成功注册");
    }
    else if(data1 == "###registration false")
    {
        /*******注册失败提示*******/
        QMessageBox::about(this,"提示","该用户已被注册");
    }

    disconnect(socket,SIGNAL(readyRead()),this,SLOT(zc_verification()));
}

void login::closeEvent(QCloseEvent *)
{
    socket->disconnectFromHost();
}

void login::back_login()
{
    //在返回login窗口之前,实现希望做的操作
    QString data1 = "#####i will off";
    socket->write(data1.toStdString().c_str());

}

void login::login_clear()
{
    ui->lineEdit->clear();
    ui->lineEdit_2->clear();
}


void login::on_pushButton_3_clicked()
{
    //开
    char buf[] = "led_on";
    socket->write(buf);
}

void login::on_pushButton_4_clicked()
{
    //关
    char buf[] = "led_off";
    socket->write(buf);
}

总结:

使用Qlist容器实现多用户套接字存储,数据库提供给注册、登陆查询功能,通过online表显示当前实时在线人数,外观方面还有很大的改进,实在太丑了,欢迎各位大佬在下方留言
V:18875508478 Q:1144535569

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QT是一种跨平台的应用程序开发框架,它可以用于开发各种类型的应用程序,包括图形界面应用程序。黑暗模式是一种目前流行的应用程序界面设计风格,它将应用程序的背景色调暗,并使用深色的文字和图标,以提供更舒适的阅读体验和减少眼睛疲劳。TCP客户端是一种通过TCP协议与服务器进行通信的应用程序。 如果要在QT实现黑暗模式的TCP客户端,可以按照以下步骤进行操作: 1. 修改应用程序的主题:首先,在QT选择一个适合的黑暗主题,或使用自定义的样式表将应用程序的背景色设置为暗色调。可以使用QPalette类或QSS(Qt样式表)来实现这个目标。 2. 自定义控件样式:根据黑暗模式的要求,使用QSS或直接在代码设置控件的颜色、边框等属性,以便其样式与黑暗模式相匹配。可以使用QStyle类或QWidget的样式相关方法进行操作。 3. 加强文字和图标的对比度:确保文本和图标在黑暗背景上具有足够的对比度,以便用户能够清楚地看到它们。可以使用QPalette类或QSS来设置颜色和字体属性。 4. 打开和关闭TCP连接:根据实际需求,使用QT提供的TCP相关类(如QTcpSocket)创建TCP连接,并实现数据的发送和接收。 5. 处理错误和异常情况:在开发TCP客户端时,需要考虑网络异常、服务器故障等情况。可以使用QT提供的错误处理机制和异常处理语句,以确保应用程序能够正确地处理这些情况。 通过以上步骤,可以在QT实现一个黑暗模式的TCP客户端。这样的应用程序既能提供舒适的用户体验,又能高效地进行与服务器的通信。 ### 回答2: Qt 黑模式是Qt图形用户界面框架的一种配色方案,可以使应用程序的界面呈现出黑暗的外观。黑模式通常用于提供更好的可视观感和舒适度,尤其在夜间使用时。在Qt实现黑模式的方法如下: 首先,在Qt项目打开黑模式,可以通过如下代码实现: ```cpp QApplication::setStyle(QStyleFactory::create("Fusion")); QPalette darkPalette; darkPalette.setColor(QPalette::Window, QColor(53, 53, 53)); darkPalette.setColor(QPalette::WindowText, Qt::white); darkPalette.setColor(QPalette::Base, QColor(25, 25, 25)); darkPalette.setColor(QPalette::AlternateBase, QColor(53, 53, 53)); darkPalette.setColor(QPalette::ToolTipBase, Qt::white); darkPalette.setColor(QPalette::ToolTipText, Qt::white); darkPalette.setColor(QPalette::Text, Qt::white); darkPalette.setColor(QPalette::Button, QColor(53, 53, 53)); darkPalette.setColor(QPalette::ButtonText, Qt::white); darkPalette.setColor(QPalette::BrightText, Qt::red); darkPalette.setColor(QPalette::Link, QColor(42, 130, 218)); darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218)); darkPalette.setColor(QPalette::HighlightedText, Qt::black); qApp->setPalette(darkPalette); ``` 以上代码将应用程序界面的各个组件的颜色设置为黑色系,并通过明亮的字体颜色进行对比。 其次,实现TCP Client的功能,需要使用Qt提供的QtNetwork模块。这里假设我们已经有了一个可用的TCP服务器(TCP Server),我们可以使用如下代码建立一个TCP客户端(TCP Client): ```cpp QTcpSocket *socket = new QTcpSocket(this); socket->connectToHost("服务器IP地址", "端口号"); if(socket->waitForConnected()){ socket->write("Hello Server"); // 向服务器发送数据 socket->waitForBytesWritten(); socket->waitForReadyRead(); QByteArray response = socket->readAll(); // 读取服务器的回应数据 // 处理服务器回应的数据 }else{ // 连接服务器失败的处理 } socket->close(); // 关闭连接 ``` 以上代码创建一个QTcpSocket对象,并使用connectToHost函数连接到指定的服务器端口。如果连接成功,我们可以通过write函数向服务器发送数据,并通过readAll函数读取服务器的回应数据。最后,使用close函数关闭连接。 这样,我们就实现了一个基本的黑模式的TCP客户端应用程序。可以根据实际需求进行更多功能的开发和定制。 ### 回答3: Qt黑模式是一种界面显示模式,它使用黑色背景和亮色文本,适合在夜间环境下使用或者用户喜好黑色主题的情况下使用。在Qt,我们可以使用QPalette类来设置界面的颜色方案,包括黑模式。 要创建一个黑模式的TCP客户端,我们需要按照以下步骤进行操作: 1. 引入Qt网络模块。为了使用TCP协议进行网络通信,我们需要在代码引入Qt网络模块。 ``` #include <QTcpSocket> ``` 2. 创建TCP客户端对象。使用QTcpSocket类创建TCP客户端对象,并与服务器建立连接。 ``` QTcpSocket *client = new QTcpSocket(this); client->connectToHost(serverIP, serverPort); ``` 3. 实现接收和发送数据的槽函数。我们可以编写接收和发送数据的槽函数,以便与服务器进行数据交互。 ``` connect(client, SIGNAL(readyRead()), this, SLOT(readData())); connect(client, SIGNAL(bytesWritten(qint64)), this, SLOT(writeData(qint64))); ``` 4. 设置黑模式界面。要设置黑模式界面,我们可以使用QPalette类来设置背景颜色和文本颜色。 ``` QPalette palette; palette.setColor(QPalette::Window, Qt::black); palette.setColor(QPalette::WindowText, Qt::white); this->setPalette(palette); ``` 以上是创建一个黑模式的TCP客户端的基本步骤。通过这些步骤,我们可以创建一个界面使用黑色背景和亮色文本的TCP客户端,并与服务器进行数据通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值