国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

QT聊天室階段性記錄(完善中:注冊功能,數(shù)據(jù)庫存儲(chǔ))

這篇具有很好參考價(jià)值的文章主要介紹了QT聊天室階段性記錄(完善中:注冊功能,數(shù)據(jù)庫存儲(chǔ))。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

server.h

#ifndef SERVERDEMO_H
#define SERVERDEMO_H

#include <QObject>
#include <QTcpServer>
#include <QMap>
#include <QSqlDatabase> //數(shù)據(jù)庫管理類
#include <QSqlQuery>    //執(zhí)行sql語句的類
#include <QSqlRecord>   //數(shù)據(jù)庫記錄類

#include "TextMessage.h"
#include "txtmsgassembler.h"
#include "TxtMsgHandler.h"

class ServerDemo : public QObject
{
    Q_OBJECT

    QTcpServer m_server;   //服務(wù)端類對象
    QMap<QTcpSocket*, TxtMsgAssembler*> m_map;
    TxtMsgHandler* m_handler;
    QSqlDatabase db;
public:
    ServerDemo(QObject* parent = NULL);
    bool start(int port);   //啟動(dòng)服務(wù)端
    void stop();            //停止服務(wù)端
    void setHandler(TxtMsgHandler* handler);//設(shè)置接口
    ~ServerDemo();

protected slots:
    void onNewConnection(); //新客戶端連接槽函數(shù)
    void onConnected();     //連接槽函數(shù)
    void onDisconnected();  //斷連槽函數(shù)
    void onDataReady();     //數(shù)據(jù)接收槽函數(shù)
    void onBytesWritten(qint64 bytes);
};

#endif // SERVERDEMO_H

server.cpp

#include "ServerDemo.h"
#include <QHostAddress>
#include <QTcpSocket>
#include <QObjectList>
#include <QDebug>

ServerDemo::ServerDemo(QObject* parent) : QObject(parent), m_handler(nullptr)
{
    //判斷字節(jié)的數(shù)據(jù)庫對象中是否包含了要處理的數(shù)據(jù)庫,如果沒有包含則添加一個(gè)數(shù)據(jù)庫,否則直接打開
    if( !db.contains("user.db") )
    {
        //添加一個(gè)數(shù)據(jù)庫,調(diào)用該類中的靜態(tài)成員函數(shù)
        db = QSqlDatabase::addDatabase("QSQLITE");//sqlite3

        //設(shè)置數(shù)據(jù)庫名字
        db.setDatabaseName("user.db");
    }

    //打開數(shù)據(jù)庫
    if( !db.open() )
    {
        qDebug() << "數(shù)據(jù)庫打開失敗" << endl;
        return;
    }

    //使用sql語句進(jìn)行表的創(chuàng)建
    QString sql = "create table if not exists user_info("
                  "username varchar(16) primary key,"
                  "password varchar(16),"
                  "status varchar(10),"
                  "level varchar(10))";
    //執(zhí)行語句
    QSqlQuery querry;

    if( !querry.exec(sql) )
    {
        qDebug() << "表創(chuàng)建失敗失敗" << endl;
        return;
    }

    connect(&m_server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
}

void ServerDemo::onNewConnection()
{
    QTcpSocket* tcp = m_server.nextPendingConnection();
    TxtMsgAssembler* assembler = new TxtMsgAssembler();

    m_map.insert(tcp, assembler);//用字典容器,為每一個(gè)客戶端分配一個(gè)裝配器類對象

    connect(tcp, SIGNAL(connected()), this, SLOT(onConnected()));
    connect(tcp, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
    connect(tcp, SIGNAL(readyRead()), this, SLOT(onDataReady()));
    connect(tcp, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));

    if( m_handler != nullptr )
    {
        TextMessage msg("CONN", tcp->peerAddress().toString() + ":" + QString::number(tcp->peerPort()));

        m_handler->handle(*tcp, msg);
    }
}

void ServerDemo::onConnected()
{

}

void ServerDemo::onDisconnected()
{
    QTcpSocket* tcp = dynamic_cast<QTcpSocket*>(sender());

    if( tcp != nullptr )
    {
        delete m_map.take(tcp);

        if( m_handler != nullptr )
        {
            TextMessage msg("DSCN", "");

            m_handler->handle(*tcp, msg);
        }
    }
}

//循環(huán)從緩存區(qū)讀取數(shù)據(jù)
void ServerDemo::onDataReady()
{
    QTcpSocket* tcp = dynamic_cast<QTcpSocket*>(sender());
    char buf[256] =  {0};
    int len = 0;

    if( tcp != NULL )
    {
        //通過字典容器找到發(fā)送信息的客戶端,
         TxtMsgAssembler* assembler = m_map.value(tcp);

        while( (len = tcp->read(buf, sizeof(buf))) > 0 )
        {
            if( assembler != nullptr )
            {
                QSharedPointer<TextMessage> ptm = nullptr;

                assembler->prepare(buf, len);

                while( (ptm = assembler->assemble()) != nullptr )
                {
                    if( m_handler != nullptr )
                    {
                        m_handler->handle(*tcp, *ptm);
                    }
                }
            }
         }
    }
}

void ServerDemo::onBytesWritten(qint64 bytes)
{
    (void)bytes;
}

//開啟服務(wù)端
bool ServerDemo::start(int port)
{
    bool ret = true;

    if( !m_server.isListening() )
    {
        ret = m_server.listen(QHostAddress("127.0.0.1"), port);
    }

    return ret;
}

//停止服務(wù)端
void ServerDemo::stop()
{
    if( m_server.isListening() )
    {
        m_server.close();
    }
}

//設(shè)置接口
void ServerDemo::setHandler(TxtMsgHandler *handler)
{
    m_handler = handler;
}

//服務(wù)端析構(gòu)
ServerDemo::~ServerDemo()
{
    const QObjectList& list = m_server.children();

    for(int i=0; i<list.length(); i++)
    {
        QTcpSocket* tcp = dynamic_cast<QTcpSocket*>(list[i]);

        if( tcp != NULL )
        {
            tcp->close();
        }
    }

    const QList<TxtMsgAssembler*>& al = m_map.values();

    for(int i = 0; i < al.length(); i++)
    {
        delete al.at(i);
    }
}

server_main.cpp

#include <QCoreApplication>
#include "serverhandler.h"
#include "ServerDemo.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ServerHandler handler;
    ServerDemo server;

    server.setHandler(&handler);
    server.start(8888);

    return a.exec();
}

client.h

#ifndef CLIENTDEMO_H
#define CLIENTDEMO_H

#include <QObject>
#include <QTcpSocket>
#include "TextMessage.h"
#include "txtmsgassembler.h"
#include "TxtMsgHandler.h"

class ClientDemo : public QObject
{
    Q_OBJECT

    QTcpSocket m_client;            //客戶端對象
    TxtMsgAssembler m_assembler;    //協(xié)議消息裝配器
    TxtMsgHandler* m_handler;       //接口函數(shù)
protected slots:
    void onConnected();             //連接事件槽函數(shù)
    void onDisconnected();          //斷連事件槽函數(shù)
    void onDataReady();             //消息事件槽函數(shù)
    void onBytesWritten(qint64 bytes);

public:
    ClientDemo(QObject* parent = NULL);
    bool connectTo(QString ip, int port);   //連接服務(wù)器
    qint64 send(TextMessage& message);      //發(fā)送協(xié)議消息
    qint64 available();                     //查看緩沖區(qū)數(shù)據(jù)個(gè)數(shù)
    void setHandler(TxtMsgHandler* handler);
    bool isValid();                         //判斷客戶端狀態(tài)
    void close();                           //關(guān)閉客戶端
};

#endif // CLIENTDEMO_H

client.cpp

#include "ClientDemo.h"
#include <QHostAddress>
#include <QDebug>

//信號(hào)與槽的映射
ClientDemo::ClientDemo(QObject* parent) : QObject(parent), m_handler(nullptr)
{
    connect(&m_client, SIGNAL(connected()), this, SLOT(onConnected()));
    connect(&m_client, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
    connect(&m_client, SIGNAL(readyRead()), this, SLOT(onDataReady()));
    connect(&m_client, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));
}

//連接信號(hào)的槽函數(shù)
void ClientDemo::onConnected()
{
    if( m_handler != nullptr )
    {
        TextMessage conn("CONN", m_client.peerAddress().toString() + ":" + QString::number(m_client.peerPort()));

        m_handler->handle(m_client, conn);
    }
}

//斷開連接的槽函數(shù)
void ClientDemo::onDisconnected()
{
    m_assembler.reset();    //重置裝配類對象

    if( m_handler != nullptr )
    {
        TextMessage dscn("DSCN", "");

        m_handler->handle(m_client, dscn);
    }
}

//接收數(shù)據(jù)的槽函數(shù)
void ClientDemo::onDataReady()
{
    char buf[256] = {0};
    int len = 0;

    //循環(huán)讀取緩沖區(qū)中的字節(jié)流數(shù)據(jù)
    while( (len = m_client.read(buf, sizeof(buf))) > 0 )
    {

        QSharedPointer<TextMessage> ptm = nullptr;

        m_assembler.prepare(buf, len);  //加入存儲(chǔ)容器

        while( (ptm = m_assembler.assemble()) != nullptr )//循環(huán)裝配協(xié)議文本,直到?jīng)]有文本可以裝配
        {
            if( m_handler != nullptr )
            {
                m_handler->handle(m_client, *ptm);
            }
        }
    }
}

void ClientDemo::onBytesWritten(qint64 bytes)
{
    (void)bytes;
}

//同步的方式連接服務(wù)端
bool ClientDemo::connectTo(QString ip, int port)
{
    m_client.connectToHost(ip, port);
    return m_client.waitForConnected();
}

//以協(xié)議消息為單位發(fā)送數(shù)據(jù)
qint64 ClientDemo::send(TextMessage& message)
{
    QByteArray ba = message.serialize();

    return m_client.write(ba.data(), ba.length());
}

//查看緩沖區(qū)的數(shù)據(jù)長度
qint64 ClientDemo::available()
{
    return m_client.bytesAvailable();
}

void ClientDemo::setHandler(TxtMsgHandler *handler)
{
    m_handler = handler;
}

//查看客戶端狀態(tài)
bool ClientDemo::isValid()
{
    return m_client.isValid();
}

//關(guān)閉客戶端
void ClientDemo::close()
{
    m_client.close();
}

client_main.cpp

#include "MainwinUI.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWin w;
    w.show();
    return a.exec();
}

階段性效果圖

QT聊天室階段性記錄(完善中:注冊功能,數(shù)據(jù)庫存儲(chǔ)),qt文章來源地址http://www.zghlxwxcb.cn/news/detail-728316.html

到了這里,關(guān)于QT聊天室階段性記錄(完善中:注冊功能,數(shù)據(jù)庫存儲(chǔ))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 階段性復(fù)習(xí) 迭代器, Lambda表達(dá)式, 泛型, 單例模式

    ?? ?迭代器(Iterator)是一種設(shè)計(jì)模式,用于順序訪問集合中的元素,而不需要了解集合內(nèi)部的結(jié)構(gòu)。 ?? ?迭代器模式將元素的遍歷行為和集合類解耦,使得可以在不修改集合類的情況下遍歷集合。 ?? ?具體來說,一個(gè)迭代器對象包含了遍歷集合所需的狀態(tài)信息,如當(dāng)前遍

    2024年02月11日
    瀏覽(21)
  • Qt項(xiàng)目網(wǎng)絡(luò)聊天室設(shè)計(jì)

    Qt項(xiàng)目網(wǎng)絡(luò)聊天室設(shè)計(jì)

    效果演示 網(wǎng)絡(luò)聊天室 網(wǎng)絡(luò)聊天室程序 基于TCP的可靠連接 (QTcpServer、QTcpSocket) 一個(gè)服務(wù)器,多個(gè)客戶端 ? 3. 服務(wù)器接收到某個(gè)客戶端的請求以及發(fā)送信息,經(jīng)服務(wù)器發(fā)給其它客戶端 最終實(shí)現(xiàn)一個(gè) 共享聊天內(nèi)容的聊天室! QTcpServer 提供一個(gè)TCP基礎(chǔ)服務(wù)類 繼承自QObject,這個(gè)類

    2024年02月10日
    瀏覽(94)
  • qt服務(wù)器 網(wǎng)絡(luò)聊天室

    qt服務(wù)器 網(wǎng)絡(luò)聊天室

    widget.cpp ?

    2024年02月15日
    瀏覽(23)
  • Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)

    Java+Vue實(shí)現(xiàn)聊天室(WebSocket進(jìn)階-聊天記錄)

    WebSocket 是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。WebSocket通信協(xié)議于2011年被IETF定為標(biāo)準(zhǔn)RFC 6455,并由RFC7936補(bǔ)充規(guī)范。WebSocket API也被W3C定為標(biāo)準(zhǔn)。 WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服

    2024年02月11日
    瀏覽(111)
  • 單晶高溫合金收獲階段性應(yīng)用成果,科研人員已開展定向凝固實(shí)驗(yàn)

    單晶高溫合金收獲階段性應(yīng)用成果,科研人員已開展定向凝固實(shí)驗(yàn)

    根據(jù)央視報(bào)道,中國科學(xué)院金屬研究所的科研人員對從太空帶回的鋁硅合金樣品進(jìn)行了初步的解剖分析工作,并計(jì)劃用不同的實(shí)驗(yàn)方法和合金材料繼續(xù)開展相關(guān)實(shí)驗(yàn)工作,以進(jìn)一步探索重力在單晶高溫合金凝固過程中的具體作用及相關(guān)機(jī)理。 值得關(guān)注的是,單晶高溫合金作為

    2024年02月12日
    瀏覽(17)
  • 基于qt軟件的網(wǎng)上聊天室軟件

    基于qt軟件的網(wǎng)上聊天室軟件

    1.服務(wù)器: ????????1).功能: 用于創(chuàng)建一個(gè)客戶端,通過文本編輯器來獲得端口號(hào),根據(jù)獲得的端口號(hào)創(chuàng)建服務(wù)器,等待客戶端連接 創(chuàng)建成功會(huì)提示服務(wù)器創(chuàng)建成功 在收到客戶端發(fā)送的信息時(shí),把這條信息發(fā)送給其他所有客戶端,實(shí)現(xiàn)群聊功能 ????????2).代碼: 2.客戶端

    2024年02月09日
    瀏覽(23)
  • Qt實(shí)戰(zhàn):云曦聊天室篇——環(huán)境部署

    基于Qt的網(wǎng)絡(luò)聊天室,可進(jìn)行群聊,私聊,添加好友,創(chuàng)建群聊,添加群聊等功能

    2024年02月05日
    瀏覽(21)
  • SpringBoot與webSocket實(shí)現(xiàn)在線聊天室——實(shí)現(xiàn)私聊+群聊+聊天記錄保存

    SpringBoot與webSocket實(shí)現(xiàn)在線聊天室——實(shí)現(xiàn)私聊+群聊+聊天記錄保存

    引用參考:原文章地址:https://blog.csdn.net/qq_41463655/article/details/92410518 在此基礎(chǔ)上實(shí)現(xiàn)對聊天記錄的保存。 代碼地址:鏈接:https://pan.baidu.com/s/1IJFZDa4S_DF08773sKJWeA 提取碼:jkui 思路:新建一個(gè)實(shí)體類用于保存聊天記錄,在消息發(fā)送時(shí),設(shè)置對象的各個(gè)值然后保存到數(shù)據(jù)庫中。

    2024年02月02日
    瀏覽(88)
  • QT C++ 基于TCP通信的網(wǎng)絡(luò)聊天室

    QT C++ 基于TCP通信的網(wǎng)絡(luò)聊天室

    .ui .pro 在pro文件中添加network庫 .h .main .cpp .ui .pro 在pro文件中添加network庫 .h .main .cpp ? ? ? ?

    2024年02月09日
    瀏覽(23)
  • 20230904 QT客戶端服務(wù)器搭建聊天室

    20230904 QT客戶端服務(wù)器搭建聊天室

    Ser Cli

    2024年02月09日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包