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_NAMESPACEclass APP : public QWidget
{Q_OBJECTpublic: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_HT1.pro
=================================================================
QT       += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += 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.0SOURCES += \main.cpp \app.cppHEADERS += \app.hFORMS += \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();
}

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=>readyReadconnect(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 USERQString s1 = "八嘎";userName = s1;//QString hostName = ui->IPed->text();//get IPQString s2 = "192.168.124.72";QString hostName = s2;quint16 port = ui->PORTed->text().toUInt();//get PORTqDebug() << "获取信息-----";//链接主机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_NAMESPACEclass Cli : public QWidget
{Q_OBJECTpublic: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 networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += 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.0SOURCES += \main.cpp \cli.cppHEADERS += \cli.hFORMS += \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();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/126152.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能井盖传感器:高效守护城市道路安全

近年来&#xff0c;井盖出问题导致事故的报道时有发生&#xff0c;但却容易被公众所忽视。井盖作为城市基础设施的一部分&#xff0c;主要用于保护下方的供水管道、下水道以及电信线缆等。然而&#xff0c;由于长时间使用、缺乏维护、设计不合理等原因&#xff0c;井盖出现问题…

C语言——程序环境和预处理(再也不用担心会忘记预处理的知识)

了解程序环境和预处理 前言&#xff1a;一、程序环境二、编译链接2.1 翻译环境2.2 编译的几个阶段2.3 运行环境 三、预处理3.1 预定义符号3.2. #define的使用3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 #和##的用途3.2.5 带副作用的宏参数3.2.6…

MySQL卸载干净再重新安装【Windows】

家人们&#xff0c;谁懂啊&#xff1f; 上学期学的数据库&#xff0c;由于上学期不知道为什么抽风&#xff0c;过得十分的迷&#xff0c;上课跟老师步骤安装好了Mysql&#xff0c;但后面在使用的过程中出现了问题&#xff0c;而且还出现了忘记密码这么蠢的操作&#xff0c;后半…

vue 子组件向父组件传递参数 子传父

子组件中写&#xff1a; this.$emit(RowCount,res.data.RowCount); 父组件中写&#xff1a; getMFGLRowCount(val){ //父组件中的方法: 接收子组件传过来的参数值赋值给父组件的变量 //this.totalCount val; alert("这…

无涯教程-JavaScript - IMREAL函数

描述 IMREAL函数以x yi或x yj文本格式返回复数的实系数。 语法 IMREAL (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the real coefficient.Required Notes Excel中的复数仅存储为文本。 当将格式为" a bi"或&q…

【漏洞复现】一米OA存在任意文件读取漏洞

漏洞描述 一米OA协同办公系统,集成了OA办公自动化系统、手机客户端、专业报表工具,为全国千万企业用户提供全功能、性价比高的OA软件。 该OA系统的getfile.jsp文件存在任意文件上传漏洞,攻击者通过漏洞可以获取服务器的敏感信息。 免责声明 技术文章仅供参考,任何个人和…

分类预测 | Matlab特征分类预测全家桶(BP/SVM/ELM/RF/LSTM/BiLSTM/GRU/CNN)

分类预测 | Matlab特征分类预测全家桶&#xff08;BP/SVM/ELM/RF/LSTM/BiLSTM/GRU/CNN&#xff09; 目录 分类预测 | Matlab特征分类预测全家桶&#xff08;BP/SVM/ELM/RF/LSTM/BiLSTM/GRU/CNN&#xff09;预测效果基本介绍程序设计参考资料致谢 预测效果 基本介绍 分类预测 | …

sql:SQL优化知识点记录(十四)

&#xff08;1&#xff09;索引失效行锁变表锁 建立2个索引 索引是失效后&#xff0c;系统性能会变查&#xff0c;如果涉及到锁的话&#xff0c;行锁会变表锁 有一个问题&#xff0c;当session1用b字段做查询条件因为是varchar类型&#xff0c;需要加双引号&#xff0c;但是没…

Win10下使用vim9

作为一个经常与文字打交道的Writer&#xff0c;你在学会Vim的基本操作之后&#xff0c;就一定会爱上Vim的。 以下是Windows10_64位&#xff08;专业版&#xff09;环境中安装、使用Vim9的全过程&#xff0c;分享一下&#xff1a; 一、下载、安装Vim9 去Vim官网去下载最新的Vi…

BMS电池管理系统——BMS的功能模块及基本要素(二)

BMS电池管理系统 文章目录 BMS电池管理系统前言一、BMS电池管理系统各个功能模块的关系二、BMS的边界及基本要素 前言 前面了解了BMS以及他的功能模块&#xff0c;这些功能模块之间的关系是什么呢&#xff1f; 一、BMS电池管理系统各个功能模块的关系 下面我们分析一下这张图…

基于STM32设计的格力空调遥控器

一、格力空调协议介绍 格力空调的红外控制协议被称为格力红外通讯协议或者格力红外遥控协议。这个协议定义了一系列红外信号&#xff0c;可以用来控制格力空调的各种操作&#xff0c;例如开关、温度控制、模式选择、风速控制等等。 格力空调的红外控制协议是一种自定义协议&a…

nvm 在 Windows 上的使用

NVM&#xff08;Node Version Manager&#xff09;是一个用于管理和切换多个 Node.js 版本的工具。它允许你在同一台机器上同时安装和使用不同版本的 Node.js&#xff0c;而无需手动安装和卸载。 之前都是只安装一个版本的 node.js&#xff0c;该更新时更新&#xff0c;使得以前…

CocosCreator3.8研究笔记(十)CocosCreator 图像资源的理解

一、图像资源导入 Cocos Creator 可使用图像文件格式&#xff0c;支持 JPG、PNG、BMP、TGA、HDR、WEBBP、PSD、TIFF 等。 将图像资源直接拖拽到 资源管理器 即可将其导入 二、图像资源的类型 在 属性检查器 面板中便可根据需要设置图像资源的使用类型&#xff1a;raw 、 textu…

处理流程设计-系统设计-人机界面设计

处理流程设计-系统设计-人机界面设计 流程表示工具&#xff08;重点&#xff09; 流程表示工具&#xff08;重点&#xff09; 数据流图也是一种 IPO 图 NS图和PAD图

图像文件的操作MATLAB基础函数使用

简介 MATLAB中的图像处理工具箱体统了一套全方位的标准算法和图形工具&#xff0c;用于进行图像处理、分析、可视化和算法开发。这里仅仅对常用的基础函数做个使用介绍。 查询图像文件的信息 使用如下函数 imfinfo(filename,fmt) 函数imfinfo返回一个结构体的info&#xff…

【AI】机器学习——线性模型(逻辑斯蒂回归)

文章目录 3.3 逻辑斯蒂回归3.3.1 逻辑回归介绍对数几率函数sigmod函数几率 3.3.2 逻辑回归模型3.3.3 参数求解逻辑斯蒂回归策略 3.3.4 损失函数3.3.5 应用&#xff1a;语句情感判断3.3.6 多角度分析逻辑回归信息论角度数学角度与朴素贝叶斯对比 3.3.7 从二分类到多分类问题多次…

Netty(一)NIO-基础

Netty 分布式根基于网络编程&#xff0c;Netty恰是java网络编程的王者&#xff0c;致力于高性能编程。 前置 适用于网络开发&#xff0c;服务器开发。多线程&#xff0c;线程池&#xff0c;maven。 大纲 NIO编程&#xff08;Selector&#xff0c;ByteBuffer和Channel&…

【区块链】DeFi是什么?大白话科普文

对于一些没有玩过区块链、或者说没有真金白银的体验过这个虚拟世界的小伙伴来说,这篇文章可以帮你了解 DeFi。致力于帮你在这个线上走出这一步。 当然这不是理财建议。 文章目录 前言什么是去中心化金融?有哪些 DeFi 项目DeFi由哪几部分构成?热门DeFi项目有哪些?前言 Def…

Gradle下载库速度过慢解决办法

最近搞了个Gradle的项目&#xff0c;项目下载依赖库太慢了&#xff0c;于是… Gradle下载库速度过慢的问题可能由多种原因导致&#xff0c;以下是一些可能的解决方案&#xff1a; 1、使用国内镜像站点&#xff1a; 你可以改变Gradle的配置&#xff0c;使用国内的镜像站点来下…

python flask框架 debug功能

从今天开始&#xff0c;准备整理一些基础知识&#xff0c;分享给需要的人吧 先整理个flask的debug功能&#xff0c;首先列举一下debug加与不加的区别&#xff0c;然后再上代码和图看看差异 区别&#xff1a; &#xff08;1&#xff09;加了debug后&#xff0c;修改js&#xf…