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();
}

相关文章:
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->se…...
吴恩达gradio课程:基于开源LLM(large language model)的聊天应用chatbot
文章目录 内容简介构建应用程序使用gradio在线体验接下来结合llm模型使用gradio构建一个完整的应用程序内容简介 Falcon 40B是当前最好的开源语言模型之一。使用text-generation库调用Falcon 40B的问答API接口。首先仅仅在代码中与模型聊天,后续通过Gradio构建聊天界面。Gradio…...
【c++】weak_ptrshared_ptr
目录 weak_ptr&shared_ptr 为什么不直接使用this指针 weak_ptr&shared_ptr weak_ptr<RtspSession> weakSelf dynamic_pointer_cast<RtspSession>(shared_from_this()); 这段代码涉及到 C 中的 weak_ptr 和 shared_ptr 的使用,以及类型转换…...
Init函数和main函数
1.Init函数和main函数 1.1. init函数 go语言中init函数用于包(package)的初始化,该函数是go语言的一个重要特性。 有下面的特征: 1 init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等2 每个包可以拥有多个init函数3 包的…...
汇川PLC学习Day1:跑马灯程序编写
汇川PLC学习Day1:跑马灯程序编写 一、 软件安装 进入官网下载软件 二、 使用帮助 三、 新建工程与功能代码实现 CtrlN 寻找内带输出模块的CPU并设置好工程名字与保存路径,语言选择想熟悉的类型 工程建立后,PLC_PRG即为用户编写程序文件…...
【已解决】Unknown initial character set index ‘45‘ received from server
出现这个数据库连接异常,可能是数据库太新,所以更新一下JDBC连接驱动,原来的是5.0.4 ,现在换成5.1.47.连接成功。 参考其他博主的文章:Java——连接数据库MySQL 5.7和8.0的区别_这段语句mysql5.7和8.0有什么区别url: …...
Java从入门到精通-数组(二)
4.数组的基本操作 数组的基本操作包括遍历数组、填充替换数组元素、对数组进行排序、复制数组以及查询数组中的元素。 • 4.1 遍历数组 遍历数组是访问数组中所有元素的过程,通常使用循环完成。 使用 for 循环遍历数组: int[] numbers {1, 2, 3, 4…...
深入剖析HTTP和HTTPS代理在爬虫中的应用价值
在当今信息时代,数据是无处不在且极其宝贵的资源。对于从互联网上获取大量结构化或非结构化数据的需求而言,网络爬虫成为一种强有力的工具。然而,在实际操作过程中,我们常常会面临许多挑战和限制。 其中一个主要问题就是目标网…...
SQL语句分类及编写规范
目录 1.SQL分类 数据定义语言 DDL 数据操纵语言 DML 数据查询语言 DQL 数据控制语言 DCL 事务控制语言 TCL 2.SQL语句的编写规范 SQL语句不区分大小写 SQL语句关键词建议大写 SQL语句每句话用分号结尾 MySQL从小白到总裁完整教程目录:https://blog.csdn.net/wei…...
02-zookeeper分布式锁案例
1 Zookeeper分布式案例 1.1 Zookeeper分布式锁原理 核心思想:当客户端要获取锁,则创建节点,使用完锁,则删除该节点。 当我们假设根节点/ 下有/locks节点时 1)客户端获取锁时,在locks节点下创建临时顺序…...
【Spring传播机制底层原理】
一、Spring的事务传播机制 Spring的事务传播机制是Spring框架中最核心的机制之一,它能够灵活地控制多个事务方法的执行顺序、提交或回滚等行为。在Spring中,事务是通过TxManager来管理的,TxManager是一个接口,提供了开启、提交、…...
python通过tkinter制作词云图工具
一、基本功能 1.采取上传文本文档(仅支持.txt格式)的方式统计词频 2.背景图形样式可选择已经设定好的,也可选择本地上传的(支持.png .jpg .jpeg格式) 3.本地上传的图片需要进行抠图处理,并将抠图结果保存…...
Java-钉钉订阅事件
文章目录 背景什么是钉钉订阅事件钉钉订阅事件的应用场景 整体思路查看钉钉文档 什么是钉钉回调钉钉回调具体实操创建自己的应用钉钉回调开发过程中遇到的问题 总结 背景 最近需要做一个业务:钉钉组织架构下添加人员之后,要对该人员的数据信息做一个处理…...
【DataV/echarts】vue中使用,修改地图和鼠标点击部分的背景色
引入:使用 DataV 引入地图的教程是参考别人的,主要介绍修改地图相关的样式; 引入地图 是参考别人的,这里自己再整理一遍,注意需要安装 5 版本以上的 echarts; DataV 网址:https://datav.aliyun.…...
系统设计类题目汇总四
25 十个异步入库任务,如何保证他们原子入库? 了解了你的问题背景,确保10个异步入库任务原子性执行(即要么全部成功,要么全部失败)有以下几种方法: 数据库事务: 如果所有的入库操作都是在同一个…...
【C++心愿便利店】No.5---构造函数和析构函数
文章目录 前言一、类的6个默认成员函数二、构造函数三、析构函数 前言 👧个人主页:小沈YO. 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C 心愿便利店 🔑本章内容:类…...
微软研究院团队获得首届AI药物研发算法大赛总冠军
编者按:AI 药物研发是人工智能未来应用的重要方向之一。自新冠病毒(SARS-CoV-2)首次爆发以来,新冠病毒的小分子药物研发备受关注,于近期举行的首届 AI 药物研发算法大赛便聚焦于此。在比赛中,来自微软研究院…...
redis实战篇之导入黑马点评项目
1. 搭建黑马点评项目 链接:https://pan.baidu.com/s/1Q0AAlb4jM-5Fc0H_RYUX-A?pwd6666 提取码:6666 1.1 首先,导入SQL文件 其中的表有: tb_user:用户表 tb_user_info:用户详情表 tb_shop:商户…...
【C++】详解红黑树并模拟实现
前言: 上篇文章我们一起学习了AVL树比模拟实现,我们发现AVL树成功地把时间复杂度降低到了O(logN)。但是同时我们不难发现一个问题,在构建AVL树中我们也付出了不小的代价,频繁的旋转操作导致效率变低。为了解决这个问题,…...
Matlab图像处理-最大类间方差阈值选择法(Otsu)
基本思想 最大类间方差阈值选择法又称为Otsu 算法,该算法是在灰度直方图的基础上用最小二乘法原理推导出来的,具有统计意义上的最佳分割阈值。它的基本原理是以最佳阈值将图像的灰度直方图分割成两部分,使两部分之间的方差取得最大值&#x…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
