Qt 0821作业

server/2024/10/19 9:34:01/

一、思维导图

二、优化聊天室代码

服务器 头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QMessageBox>
#include <QTcpSocket>
#include <QList>
#include <QNetworkInterface>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void newConnection_slot();void readyRead_slot();private slots:void on_startBtn_clicked();private:Ui::Widget *ui;QTcpServer *server; //实例化服务器对象QList<QTcpSocket *> socketList; //定义容器存放客户端
};
#endif // WIDGET_H

服务器源文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), server(new QTcpServer(this))
{ui->setupUi(this);QString ip_address;QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses(); //获取所有ipfor(int i = 0; i < ipAddressesList.size(); i++){QHostAddress ipAddr = ipAddressesList.at(i);if(ipAddr.protocol() == QAbstractSocket::IPv4Protocol){  //筛选ipv4if(!ipAddr.toString().startsWith("169")){   //过滤网卡、路由器ipip_address = ipAddr.toString();break;}}}if(ip_address.isEmpty()){ip_address = QHostAddress(QHostAddress::LocalHost).toString();}ui->ipNetLab->setText(ip_address);
}Widget::~Widget()
{delete ui;
}void Widget::newConnection_slot()
{//newConnection信号对应槽函数//获取套接字QTcpSocket *s = server->nextPendingConnection();socketList.push_back(s);    //尾插connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
}void Widget::readyRead_slot()
{//readyRead信号对应槽函数//读取数据for(int i = 0; i < socketList.count(); i++){if(socketList.at(i)->state() == 0){//移除无效客户端socketList.removeAt(i);}}for(int i = 0; i < socketList.count(); i++){if(socketList.at(i)->bytesAvailable() != 0){//读取有待读数据QByteArray msg = socketList.at(i)->readAll();ui->listWidget->addItem(QString::fromLocal8Bit(msg));//广播给所有客户端for(int j = 0; j < socketList.count(); j++){socketList.at(j)->write(msg);}}}
}void Widget::on_startBtn_clicked()
{//启动//获取端口号quint16 port = ui->portEdit->text().toUInt();//设置监听if(server->listen(QHostAddress::Any, port)){QMessageBox::information(this, "", "启动服务器成功");} else {QMessageBox::warning(this, "", "启动服务器失败");return;}connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);
}

客户端头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic slots:void connected_slot();      //connected()信号void readyRead_slot();      //readyRead()信号void disconnected_slot();   //disconnected()信号public:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_connectBtn_clicked();void on_sendBtn_clicked();void on_disconnectBtn_clicked();private:Ui::Widget *ui;QTcpSocket *socket;     //实例化一个客户端指针对象QString userName;       //定义一个存储用户信息的变量
};
#endif // WIDGET_H

客户端源文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), socket(new QTcpSocket(this))
{ui->setupUi(this);//初始化界面ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);//客户端连接服务器connect(socket, &QTcpSocket::connected, this, &Widget::connected_slot);//接收数据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()
{//连接按钮对应槽函数//获取ip和portQString ip = ui->ipEdit->text();quint16 port = ui->portEdit->text().toUInt();//客户端连接服务器socket->connectToHost(ip, port);
}void Widget::connected_slot()
{userName = ui->userNameEdit->text();QString msg = userName + " 进入聊天室";//将信息发送到服务器socket->write(msg.toLocal8Bit());//连接服务器成功QMessageBox::information(this, "提示", "链接服务器成功", QMessageBox::Ok);//组件可用的相关设置ui->msgEdit->setEnabled(true);ui->sendBtn->setEnabled(true);ui->disconnectBtn->setEnabled(true);ui->userNameEdit->setEnabled(false);ui->ipEdit->setEnabled(false);ui->portEdit->setEnabled(false);ui->connectBtn->setEnabled(false);
}void Widget::readyRead_slot()
{//读取服务器发来的数据QByteArray msg = socket->readAll();QString s = QString::fromLocal8Bit(msg);//截取用户名QString user_Name = s.mid(0, userName.size());if(user_Name == userName){if(s.mid(userName.size(), 1) == " "){QListWidgetItem *item = new QListWidgetItem(s);item->setTextAlignment(Qt::AlignCenter);ui->listWidget->addItem(item);}else{//如果是本机用户则右对齐QListWidgetItem *item = new QListWidgetItem(s);item->setTextAlignment(Qt::AlignRight);ui->listWidget->addItem(item);}}else{//将数据放入ui界面上ui->listWidget->addItem(QString::fromLocal8Bit(msg));}}void Widget::disconnected_slot()
{//组件可用的相关设置ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);ui->userNameEdit->setEnabled(true);ui->ipEdit->setEnabled(true);ui->portEdit->setEnabled(true);ui->connectBtn->setEnabled(true);
}void Widget::on_disconnectBtn_clicked()
{//发送断开信息给服务器QString msg = userName + " 离开聊天室";//发送给服务器socket->write(msg.toLocal8Bit());//断开与服务器的连接socket->disconnectFromHost();
}void Widget::on_sendBtn_clicked()
{//获取ui界面的信息QString msg = ui->msgEdit->toPlainText();msg = userName + ": " + msg;//发送给服务器socket->write(msg.toLocal8Bit());//清空编辑器ui->msgEdit->clear();
}


http://www.ppmy.cn/server/104361.html

相关文章

Python爬虫——简单网页抓取(实战案例)小白篇

Python 爬虫是一种强大的工具&#xff0c;用于从网页中提取数据。这里&#xff0c;我将通过一个简单的实战案例来展示如何使用 Python 和一些流行的库&#xff08;如 requests 和 BeautifulSoup&#xff09;来抓取网页数据。 实战案例&#xff1a;抓取一个新闻网站的头条新闻标…

【函数详解】一、函数入门

文章目录 一、函数定义二、函数调用1. 调用同一个包定义的函数2. 调用其他包定义的函数 https://cloud.tencent.com/developer/article/2232167学习笔记 在Go语言中&#xff0c;函数主要有三种类型&#xff1a; 普通函数匿名函数&#xff08;闭包&#xff09;类方法 一、函数…

证书学习(二)搞懂 keystore、jks、p12、pfx、crt、csr、pem文件的区别

目录 一、背景二、文件格式的区分2.1 .keystore / .jks 文件2.2 .p12 / .pfx 文件2.3 .crt 文件2.4 csr 文件2.5 .pem 文件 三、总结 一、背景 我们在日常的开发过程中&#xff0c;经常会见到各种各样的证书相关类型的文件&#xff0c;错综复杂。 其实 keystore、jks、p12、p…

【QT从入门helloworld到进阶QT(C++)部署YOLOV5】

QT入门看这一篇就够&#xff08;详解含qt源码&#xff09; Qt Creator 简单使用 1.1 Qt Creator 界面组成 启动 Qt Creator 后&#xff0c;Qt Creator 的主界面如下图&#xff0c;默认打开的是欢迎页面。 可以看到 Qt Creator里自带很多示例。 在 Ubuntu 里&#xff0c;由于…

数学基础 -- 线性代数之行列式不变性推导

行列式不变性的推导 我们要证明&#xff1a;给矩阵的一行&#xff08;或列&#xff09;加上另一行&#xff08;或列&#xff09;的倍数&#xff0c;这种操作不会改变行列式的值。 问题描述 假设我们有一个矩阵 A A A&#xff0c;其大小为 3 3 3 \times 3 33&#xff0c;如…

【图文并茂】ant design pro 如何给后端发送 json web token - 请求拦截器的使用

上一节有讲过 【图文并茂】ant design pro 如何对接后端个人信息接口 还差一个东西&#xff0c;去获取个人信息的时候&#xff0c;是要发送 token 的&#xff0c;不然会报 403. 就是说在你登录之后才去获得个人信息。这样后端才能知道是谁的信息。 token 就代码了某个人。 …

C++实现Matlab imregionalmax函数——查找区域最大值

C实现imregionalmax函数 1 说明2 示例3 C实现 1 说明 Matlab imregionalmax BW imregionalmax(I) 返回标识灰度图像 I 中区域最大值的二值图像BW。 区域最大值点是具有同一强度值的连通像素分量&#xff0c;其周围的像素强度值比该值低。 BW — 逻辑数组 区域最大值的位置&…

从0开始构建HTML页面(1)

从0开始构建HTML页面 目录 从0开始构建HTML页面的技术文档 一、简介 二、常用标签与属性 三、事件处理与交互性 一、简介 &#xff08;HyperText Markup Language&#xff09;是一种用于创建网页的标准标记语言。它允许开发者使用标签来描述网页的结构&#xff0c;并定义网页…