QT day5

服务器:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给服务器指针实例化对象server = new QTcpServer(this);
}Widget::~Widget()
{delete ui;
}//启动服务器按钮对应的槽函数
void Widget::on_pushButton_clicked()
{//获取ui界面上的端口号quint16 port = ui->lineEdit->text().toUInt();//将服务器设置成监听状态if(!server->listen(QHostAddress::Any, port)){QMessageBox::critical(this, "失败", "服务器启动失败");return;}else{QMessageBox::information(this, "成功", "服务器启动成功");}//此时表明服务器启动成功,并对客户端连接进行监听//如果有客户端向服务器发射连接请求,那么该服务器就会自动发射一个newConnection的信号connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);
}//处理newConnection
void Widget::newConnection_slot()
{qDebug() << "有新的客户端发来连接请求了";//获取最新连接的客户端套接字QTcpSocket *s = server->nextPendingConnection();//将获取的套接字存放到客户端容器中clientlist.push_back(s);connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
}void Widget::readyRead_slot()
{//删除客户端链表中无效的客户端套接字for(int i=0; i<clientlist.count(); i++){//判断套接字的状态if(clientlist[i]->state() == 0)     //SocketState state() const{                                   //功能:返回客户端套接字的状态clientlist.removeAt(i);}                                   //返回值:客户端的状态,如果结果为0,表示未连接}//遍历所有客户端,查看是哪个客户端发来数据for(int i=0; i<clientlist.count(); i++){if(clientlist[i]->bytesAvailable() != 0){//读取当前客户端的相关数据QByteArray msg = clientlist[i]->readAll();//将数据展示到ui界面上ui->listWidget->addItem(QString::fromLocal8Bit(msg));//将接受的信息,发送给所有客户端for(int j=0; j<clientlist.count(); j++){clientlist[j]->write(msg);}}}
}

客户端:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);socket = new  QTcpSocket(this);connect(socket, &QTcpSocket::connected, this, &Widget::connected_slot);//客户端与服务器连接成功后,服务器向客户端发来数据,那么客户端就会发射一个readyRead信号connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);
}Widget::~Widget()
{delete ui;
}void Widget::on_connectBtn_clicked()
{if(ui->connectBtn->text() == "连接服务器"){//获取ui界面信息Name = ui->userNameEdit->text();QString hostName = ui->ipEdit->text();quint16 port = ui->portEdit->text().toUInt();//连接到主机socket->connectToHost(hostName, port);//如果连接服务器成功,该客户端就会发射一个connected的信号ui->connectBtn->setText("断开服务器");}else if(ui->connectBtn->text() == "断开服务器"){QString msg = Name + ":拿手好戏后 离开聊天室";socket->write(msg.toLocal8Bit());//断开客户端与服务器的连接socket->disconnectFromHost();//当客户端与服务器断开,该客户端就会自动发送一个disconnected的信号ui->connectBtn->setText("连接服务器");}
}//处理conneed信号的槽函数定义
void Widget::connected_slot()
{QMessageBox::information(this, "成功", "连接服务器成功");//顺便向服务器发送一条信息,说:***,进入聊天室QString msg = Name + ":带着power 进入聊天室";socket->write(msg.toLocal8Bit());
}void Widget::readyRead_slot()
{QByteArray msg = socket->readAll();ui->msgList->addItem(QString::fromLocal8Bit(msg));
}void Widget::on_sendBtn_clicked()
{//获取ui界面的编辑的文本QString m = ui->msgEdit->text();//整合要发送的信息QString msg = Name + ":" + m;//将信息发送给服务器socket->write(msg.toLocal8Bit());//发送后清空文本ui->msgEdit->clear();
}void Widget::disconnected_slot()
{QMessageBox::information(this, "退出", "断开服务器");
}

思维导图:

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

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

相关文章

无涯教程-JavaScript - BIN2DEC函数

描述 BIN2DEC函数将二进制数字转换为十进制。 语法 BIN2DEC (number)争论 Argument描述Required/Optionalnumber 您要转换的二进制数。 Number cannot contain more than 10 characters (10 bits). 数字的最高有效位是符号位。其余的9位是幅度位。 负数使用二进制补码表示。…

切片机制和MR工作机制

InputFormat基类 TextInputFormat&#xff1a;TextInputFormat是默认的FileInputFormat实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量&#xff0c; LongWritable类型。 CombineTextInputFormat&#xff1a;CombineTextInputFormat用于小文件过多的场景…

Calico IP In IP模拟组网

Calico IP In IP模拟组网 网络架构 模拟组网 先在k8s-master-1节点执行如下命令&#xff1a; # 创建veth-pair设备对ip link add veth1 type veth peer name eth0# 创建ns1网络命名空间ip netns add ns1# 将eth0网卡插入ns1网络命名空间ip link set eth0 netns ns1# 为ns1网…

润和软件HopeStage与上海瑞美云LIS系统管理软件完成产品兼容性互认证

近日&#xff0c;江苏润和软件股份有限公司&#xff08;以下简称“润和软件”&#xff09;HopeStage 操作系统与上海瑞美电脑科技有限公司&#xff08;以下简称“上海瑞美”&#xff09;瑞美云LIS系统管理软件完成产品兼容性测试。 测试结果表明&#xff0c;企业级通用操作系统…

为什么零基础选择语言首选python

在众多编程语言中&#xff0c;似乎已经没有什么能够阻挡Python的步伐。本月Python又是第一名&#xff0c;市场份额达到了13.42%&#xff0c;在2023年&#xff0c;Python已经连续7个月蝉联榜首&#xff0c;遥遥领先于其他对手。 每个月榜单发布后&#xff0c;都有小伙伴会好奇&…

基于docker环境的tomcat开启远程调试

背景&#xff1a; Tomcat部署在docker环境中&#xff0c;使用rancher来进行管理&#xff0c;需要对其进行远程调试。 操作步骤&#xff1a; 1.将容器中的catalina.sh映射出来&#xff0c;便于对其修改&#xff0c;添加远程调试相关参数。 注意&#xff1a;/data/produce2201…

kafka 命令脚本说明以及在java中使用

一、命令行使用 1.1、topic 命令 1、关于topic,这里用window 来示例 bin\windows\kafka-topics.bat2、创建 first topic,五个分区&#xff0c;1个副本 bin\windows\kafka-topics.bat --bootstrap-server localhost:9092 --create --partitions 5 --replication-factor 1 -…

Redis从基础到进阶篇(三)----架构原理与集群演变

目录 一、缓存淘汰策略 1.1 LRU原理 1.2 案例分析 1.3 Redis缓存淘汰策略 1.3.1 设置最⼤缓存 1.3.2 淘汰策略 二、Redis事务 2.1 Redis事务典型应⽤—Redis乐观锁 2.2 Redis事务介绍 2.3 事务命令 2.3.1 MULTI 2.3.2 EXEC 2.3.3 DISCARD 2.3.4 WATCH 2.3.5 UNW…

实时操作系统Freertos开坑学习笔记:(八):信号量、事件标志组、任务通知机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、信号量的简介1.信号量与队列的区别&#xff1f; 二、二值信号量及其实例1.什么是二值信号量2.二值信号量相关API函数3.二值信号量实例 三、计数型信号量四、…

vscode宏键绑定

开发语言php 实现输入[ 得到 [];的效果 [win]ctrlp,[mac]superp 输入>keyboard 选择 在json文件里增加(目前有缺陷,sublime的设置是比较完美的.或者phpstorm默认不需要配置): {"key": "[","command": "editor.action.insertSnippet&…

Spark2x原理剖析(二)

一、概述 基于社区已有的JDBCServer基础上&#xff0c;采用多主实例模式实现了其高可用性方案。集群中支持同时共存多个JDBCServer服务&#xff0c;通过客户端可以随机连接其中的任意一个服务进行业务操作。即使集群中一个或多个JDBCServer服务停止工作&#xff0c;也不影响用…