20230904 QT客户端服务器搭建聊天室

这篇具有很好参考价值的文章主要介绍了20230904 QT客户端服务器搭建聊天室。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Ser

cpp
=================================================================
#include "app.h"
#include "ui_app.h"

APP::APP(QWidget *parent):QWidget(parent),ui(new Ui::APP)
{
    ui->setupUi(this);
    this->resize(550,400);

    ui->Line->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中
    ui->Line->setFont(QFont("楷体",10));
    ui->LB1->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中
    ui->LB1->setFont(QFont("楷体",13));
    //ui->Listw->setFont(QFont("楷体",8));
    ui->SB1->setFont(QFont("华文行楷",15));

    server = new QTcpServer(this); //创建服务器server

}

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

//Start服务器按钮对应的槽函数
void APP::on_SB1_clicked()
{
    //获取UI界面的port号
    quint16 port = ui->Line->text().toUInt();

   //服务器设定为监听状态
   //bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any,quint16 port = 0)
   //参数1:监听的主地址,any=>所有的;也可给定特定的地址进行监听
   //参数2:通过指定的端口号进行访问服务器,若为0,则表示由服务器自动分配,若非0则表示指定端口号
   //返回值,成功<=true;失败<=false;
    if(!server->listen(QHostAddress::Any,port))
    {
        QMessageBox::critical(this,"失败","Server启动失败");
        return;
    }
    else
    {
        QMessageBox::about(this,"成功","启动成功");
    }

    //Server启动成功,对客户端进行监听
    //有客户端发送来的链接请求,服务器会自动发送一个newConenction信号
    //将该信号连接到对应的槽函数中处理相关逻辑
    connect(server,&QTcpServer::newConnection,this,&APP::newConnection_slot);



}
void APP::newConnection_slot()//处理newConnection信号的槽函数的实现
{
    qDebug() <<"Cli连接了请求了";

    //获取最新链接的客户端套接字
    //原型 [virtual] QTcpsocket *QTcpseicer::nextPendingConnection()
    //参数:无
    //返回值:最新链接客户端套接字的指针
    QTcpSocket *s = server->nextPendingConnection();

    clientList.push_back(s);//将获取到的套接字存放到客户端的容器中

    //此时已经链接上客户端了
    //如果该套接字有数据数据项服务器发送过来,则该套接字就会自动发射一个readyRead信号
    //用该信号处理相关函数
    connect(s,&QTcpSocket::readyRead,this,&APP::readyRead_slot);
}

void APP::readyRead_slot()//关于readyRead信号对应的槽函数
{
    //排除客户端链表中无效的客户端套接字
    for(int i=0;i<clientList.count();i++)
    {
        //判断套接字状态
        //原型:SocketState state() const
        //功能:返回客户端套接字状态
        //参数:无
        //返回值:客户端的状态,若结果为,则表示未链接
        if(clientList[i]->state() == 0)
        {
            clientList.removeAt(i);//若为,则removed掉
        }

    }

    //便利所有的客户端查看哪个客户端发来的数据
    for(int i=0;i<clientList.count();i++)
    {
        //原型:qint64 bytesAvailiable() const override
        //功能:返回客户端套接字中可读的字节个数
        //参数:无
        //返回值:当前客户端的可读的字节个数,若结果为,则表示无数据可读
        if(clientList[i]->bytesAvailable() != 0)
        {
            //读取当前客户端的相关数据
            //原型:QByteArray readAll()
            //功能:读取当前套接字中的所有数据,返回一个字节数组
            //参数:无
            //返回值:返回的字节数组
            QByteArray msg = clientList[i]->readAll();

            //数据=>UI界面上
            ui->Listw->addItem(QString::fromLocal8Bit(msg));

            //接收到的消息,发送给所有的客户端
            for(int j=0;j<clientList.count();j++)
            {
                clientList[j]->write(msg);
            }
        }

    }
}
.h
=================================================================
#ifndef APP_H
#define APP_H
//头文件
#include <QWidget>
#include <QTcpServer>//服务器
#include <QTcpSocket>//客户段
#include <QList>//链表   存放客户端的容器
#include <QDebug>
#include <QMessageBox>//消息



QT_BEGIN_NAMESPACE
namespace Ui { class APP; }
QT_END_NAMESPACE

class APP : public QWidget
{
    Q_OBJECT

public:
    APP(QWidget *parent = nullptr);
    ~APP();

    //QList<QTcpServer *> clientList;

private slots:
    void on_SB1_clicked();
    void newConnection_slot();
    void readyRead_slot();

private:
    Ui::APP *ui;

    QTcpServer *server;
    QList<QTcpSocket *> clientList;
};
#endif // APP_H

T1.pro
=================================================================
QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    app.cpp

HEADERS += \
    app.h

FORMS += \
    app.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
mian.cpp
=================================================================
#include "app.h"

#include <QApplication>

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

20230904 QT客户端服务器搭建聊天室,qt,服务器,命令模式

Cli

cpp
=================================================================
#include "cli.h"
#include "ui_cli.h"

Cli::Cli(QWidget *parent):QWidget(parent),ui(new Ui::Cli)
{
    ui->setupUi(this);
    socket = new QTcpSocket(this);//客户端指针实例化空间
    ui->USER->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中
    ui->USER->setFont(QFont("楷体",10));
    ui->USERed->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中
    ui->USERed->setFont(QFont("楷体",10));
    ui->IP->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中
    ui->IP->setFont(QFont("楷体",10));
    ui->IPed->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中
    ui->IPed->setFont(QFont("楷体",10));
    ui->PORT->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中
    ui->PORT->setFont(QFont("楷体",10));
    ui->PORTed->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中
    ui->PORTed->setFont(QFont("楷体",10));
    ui->msged->setFont(QFont("等线",10));
    ui->connectSB1_2->setFont(QFont("华文行楷",15));
    ui->disconnectSB2_2->setFont(QFont("华文行楷",15));
    ui->sendSB3->setFont(QFont("华文行楷",15));

    //connect(ui->connectSB1_2,&QPushButton::clicked,this,&Cli::readyRead_slot);

    //如果链接Server成功(只链接一次),客户端就会发射一个connected的信号,将该信号链接槽函数
    connect(socket,&QTcpSocket::connected,this,&Cli::connect_slot);

    //客户端与服务器链接成功后,若服务器向客户端发送来数据,则客户端就会自动发射一个readyRead信号
    //Ser<=>Cli,if(Ser=>),CLi=>readyRead
    connect(socket,&QTcpSocket::readyRead,this,&Cli::readyRead_slot);

    //客户端与服务器链接成功后,客户端就会自动发射一个disconnected信号
    connect(socket,&QTcpSocket::disconnected,this,&Cli::disconnected_slot);
}

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


void Cli::on_connectSB1_2_clicked()
{
    //userName = ui->USERed->text();//get USER
    QString s1 = "八嘎";
    userName = s1;
    //QString hostName = ui->IPed->text();//get IP
    QString s2 = "192.168.124.72";
    QString hostName = s2;
    quint16 port = ui->PORTed->text().toUInt();//get PORT

    qDebug() << "获取信息-----";
    //链接主机
    socket->connectToHost(hostName,port);
    qDebug() << "链接成功";

    //if链接服务器成功,Cli发送一个connect信号,由于该链接之链接一次所以写于构造函数中
}

void Cli::connect_slot()
{
    QMessageBox::information(this,"连线","链接成功");

    QString msg = userName + ":进入聊天室";

    socket->write(msg.toLocal8Bit());
}

void Cli::readyRead_slot()
{
    //读取客户端的数据
    QByteArray msg = socket->readAll();
    //数据展示在UI界面上
    ui->Listw->addItem(QString::fromLocal8Bit(msg));
}

void Cli::on_sendSB3_clicked()
{
    //获取ui界面输入的内容
    QString m = ui->msged->text();

    //整合信息
    QString msg = userName + ": " + m;

    socket->write(msg.toLocal8Bit());
}

void Cli::on_disconnectSB2_2_clicked()//断开服务器
{
    //准备要发送的信息
    QString msg = userName + ": 离开聊天室";
    socket->write(msg.toLocal8Bit());

    socket->disconnectFromHost();

    //断开后,客户端自动发送一个disconnect信号=>将该connect信号与槽函数链接
}

void Cli::disconnected_slot()
{
    QMessageBox::information(this,"断开链接","断开成功");
}

void Cli::on_SB4_clicked()
{
    ui->Listw->clear();
}
.h
=================================================================
#ifndef CLI_H
#define CLI_H

#include <QWidget>
#include <QTcpServer>//服务器
#include <QTcpSocket>//客户段
#include <QList>//链表   存放客户端的容器
#include <QDebug>
#include <QMessageBox>//消息

QT_BEGIN_NAMESPACE
namespace Ui { class Cli; }
QT_END_NAMESPACE

class Cli : public QWidget
{
    Q_OBJECT

public:
    Cli(QWidget *parent = nullptr);
    ~Cli();

private slots:
    void on_connectSB1_2_clicked();
    void connect_slot();//处理connect信号的槽函数
    void readyRead_slot();//处理readyRead信号的槽函数

    void on_sendSB3_clicked();//发送数据

    void on_disconnectSB2_2_clicked();//断开服务器

    void disconnected_slot();//disconnected信号 断开服务器提示
    void on_SB4_clicked();

private:
    Ui::Cli *ui;

    //QTcpServer *server;
    QTcpSocket *socket;
    QString userName;

};
#endif // CLI_H
.pro
=================================================================
QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    cli.cpp

HEADERS += \
    cli.h

FORMS += \
    cli.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
.main
=================================================================
#include "cli.h"

#include <QApplication>

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

20230904 QT客户端服务器搭建聊天室,qt,服务器,命令模式文章来源地址https://www.toymoban.com/news/detail-702096.html

到了这里,关于20230904 QT客户端服务器搭建聊天室的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Qt多线程TCP服务器客户端传输文件

    Qt多线程TCP服务器客户端传输文件

    TCP是面向连接的运输层协议。应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)。 TCP提供可靠交付的服务。通过TCP 连接传送的数据,无差错、不丢失、不

    2024年02月13日
    浏览(11)
  • QT下的多线程TCP客户端和服务器

    qt下的QTcpSocket在同一个线程使用时没有问题的,但是如果进行跨线程,很容易出现问题。那么有什么方法可以跨线程进行使用吗? 答案是肯定的:使用QThread的movetothread可以完成扩线程接收。 首先是基于QTcpSocket的类 头文件tcpsocket.h 然后是cpp文件tcpsocket.cpp 再次基础上,创建

    2024年01月17日
    浏览(13)
  • mqtt服务器搭建与qt下的mqtt客户端实现

    mqtt服务器搭建与qt下的mqtt客户端实现

      MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(Io

    2024年02月06日
    浏览(18)
  • QT实现客户端服务器HTTP(get请求、post请求)

    QT实现客户端服务器HTTP(get请求、post请求)

    服务器代码如下: QtHttpForS.h QtHttpForS.cpp main.cpp QtHttpForS.ui 客户端代码: QtHttpForC.h QtHttpForC.cpp mian.cpp QtHttpForC.ui 程序运行效果: GET请求: POST请求: POST请求使用postman测试: 注意: 可以发现,在使用postman进行POST请求发送时,服务器接收到的请求头与QTSocket的POST请求的请求头

    2023年04月22日
    浏览(15)
  • 服务器异步客户端

    internal class MessageManagerT:SingletonMessageManagerT {     Dictionaryint, ActionT MsgDic = new Dictionaryint, ActionT();     public void OnAddListen(int id,ActionT action)     {         if(MsgDic.ContainsKey(id))         {             MsgDic[id] += action;         }         else         {             MsgDic.Add(id, ac

    2024年04月09日
    浏览(12)
  • UDP客户端和服务器

    UDP客户端和服务器

    UDP客户端,也就是首先主动发送数据的一方,也就是发起服务请求的一方。 UDP服务器,也就是首先等待接收数据,并对接收的数据进行处理,返回计算结果的一方,也就是提供服务的一方。 在下面实验中使用到的函数 测试代码  UDP接收端(服务器) 执行代码:    实验解析 

    2024年02月13日
    浏览(22)
  • UDP通讯(服务器/客户端)

    UDP通讯(服务器/客户端)

    前言:UDP通讯实现比较简单,单某些情况下也会使用,建议先看一下说明,然后运行代码感受一下。         传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议。TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输。但U

    2024年02月03日
    浏览(16)
  • ZeroTier客户端连接服务器

    ZeroTier客户端连接服务器 下载客户端 https://www.zerotier.com/download/ 加入新的网络(例如d5e04297a16fa690,由管理员提供) 管理员授权并告知服务器IP 测试连接:ping 服务器IP 使用putty, pycharm, vscode等工具连接即可 官方文档 https://docs.zerotier.com/getting-started/getting-started 注: 若路由器无法

    2024年02月09日
    浏览(13)
  • Java 构建websocket客户端,构建wss客户端,使用wss连接,并发送数据到服务器端,接收服务器端消息

    Java 构建websocket客户端,构建wss客户端,使用wss连接,并发送数据到服务器端,接收服务器端消息 回调函数处理

    2024年02月13日
    浏览(17)
  • netty构建udp服务器以及发送报文到客户端客户端详细案例

    netty构建udp服务器以及发送报文到客户端客户端详细案例

    目录 一、基于netty创建udp服务端以及对应通道设置关键 二、发送数据 三、netty中的ChannelOption常用参数说明 1、ChannelOption.SO_BACKLOG 2、ChannelOption.SO_REUSEADDR 3、ChannelOption.SO_KEEPALIVE 4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF 5、ChannelOption.SO_LINGER 6、ChannelOption.TCP_NODELAY 以上代码中

    2024年04月09日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包