作业8/21

 client

cpp
#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 界面// 控件初始状态设置为禁用,防止未连接时误操作ui->sendBtn->setEnabled(false);ui->sendEdit->setEnabled(false);ui->brokenBtn->setEnabled(false);// 信号与槽的连接connect(socket, &QTcpSocket::connected, this, &Widget::connected_slot);connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);//如果成功断开与服务器的连接,那么客户端就会自动发射一个disconnected的信号//我们就可以将该信号连接到自定义的槽函数,。由于只需连接一次,所以连接函数写在构造函数中。connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);}Widget::~Widget()
{delete ui;delete socket; // 释放socket的内存
}// 当连接成功时的处理函数
void Widget::connected_slot()
{userName = ui->userEdit->text(); // 读取用户输入的用户名QString msg = userName + ":进入聊天室"; // 构建进入聊天室的欢迎消息// 将消息写入 socket,并发送到服务器socket->write(msg.toLocal8Bit());socket->flush(); // 确保所有数据都被发送// 显示连接成功的信息QMessageBox::information(this,"提示","已连接到服务器");// 启用发送控件,禁用连接控件ui->sendEdit->setEnabled(true);ui->sendBtn->setEnabled(true);ui->brokenBtn->setEnabled(true);ui->userEdit->setEnabled(false);ui->ipEdit->setEnabled(false);ui->portEdit->setEnabled(false);ui->connectBtn->setEnabled(false);
}// 当 socket 准备读数据时的处理函数
void Widget::readyRead_slot()
{// 读取 socket 中的所有数据QByteArray msg = socket->readAll();qDebug() << msg;//将数据放入ui界面上ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}//disconnected()信号对应的槽函数
void Widget::disconnected_slot()
{//组件可用的相关设置ui->sendEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->brokenBtn->setEnabled(false);ui->userEdit->setEnabled(true);ui->ipEdit->setEnabled(true);ui->portEdit->setEnabled(true);ui->connectBtn->setEnabled(true);
}//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{//获取ui界面上的ip和端口号QString ip = ui->ipEdit->text();quint16 port = ui->portEdit->text().toUShort(); // 转换为 quint16 //字符串转换成整型socket->connectToHost(ip,port);
}//发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{//获取ui界面的信息QString msg = ui->sendEdit->text();msg = userName + ":" + msg;//发送给服务器socket->write(msg.toLocal8Bit());socket->flush();//清空行编辑器ui->sendEdit->clear();
}//断开连接按钮对应的槽函数
void Widget::on_brokenBtn_clicked()
{//告诉服务器 我走了QString msg = userName + ":离开聊天室";//发送给服务器socket->write(msg.toLocal8Bit());socket->flush();//断开与服务器的连接socket->disconnectFromHost(); // 断开连接//如果成功断开与服务器的连接,那么客户端就会自动发射一个disconnected的信号//我们就可以将该信号连接到自定义的槽函数,。由于只需连接一次,所以连接函数写在构造函数中。}
h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer> // 注意:QTcpServer 通常用于服务器端,这里应使用 QTcpSocket
#include <QTcpSocket> // 客户端类
#include <QMessageBox> // 消息对话框
#include <QDebug>
#include <QByteArray>
#include <QIODevice>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();signals:void disconnected();// 私有槽函数,由信号触发执行
private slots:// 当 QTcpSocket 连接成功时调用void connected_slot();// 当 QTcpSocket 准备读取数据时调用void readyRead_slot();void disconnected_slot();// 公共槽函数,由 UI 控件触发执行
public slots:void on_connectBtn_clicked();void on_sendBtn_clicked();void on_brokenBtn_clicked();private:Ui::Widget *ui;QTcpSocket *socket; // QTcpSocket 对象,用于客户端连接QString userName; // 用户名};
#endif // WIDGET_H

服务器 

.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpServer>
#include <QMessageBox>
#include <QDebug>
#include <QTcpSocket>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
.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), server(new QTcpServer(this))
{ui->setupUi(this);}Widget::~Widget()
{delete ui;
}
// newConnection信号对应槽函数
void Widget::newConnection_slot()
{qDebug() << "有新的客户端连接····";// 获取最新客户端套接字// virtual QTcpSocket *nextPendingConnection();// 返回值:客户端套接字————QTcpSocket类QTcpSocket *s = server->nextPendingConnection();// 将获取的客户端套接字放入容器socketList.push_back(s);//connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}void Widget::readyRead_slot()
{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界面ui->listWidget->addItem(QString::fromLocal8Bit(msg));// 广播所有客户端for (int j = 0; j < socketList.count(); j++) {socketList.at(j)->write(msg);}}}
}//启动服务器按钮的槽函数
void Widget::on_startBtn_clicked()
{// ui界面的端口号quint16 port = ui->portEdit->text().toUInt();// 服务器监听连接// bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);// const QHostAddress &address = QHostAddress::Any,// quint16 port = 0if( server->listen(QHostAddress::Any,port) ){QMessageBox::information(this,"","启动服务器成功!");}else{QMessageBox::information(this,"","启动服务器失败!");return;}connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);}

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

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

相关文章

Linux timedatectl 命令

timedatectl 是 Linux 系统中用于查询和更改系统日期、时间和时区的工具&#xff0c;它特别适用于那些使用 systemd 作为系统和服务管理器的系统。语法格式为“timedatectl [参数]”。 发现电脑时间跟实际时间不符&#xff1f;如果只差几分钟的话&#xff0c;我们可以直接调整。…

tekton通过ceph挂载node_modules的时候报错failed to execute command: copying dir: symlink

分析&#xff1a; 如果ceph的mountPath和workingDir路径一致的话&#xff0c;就会报错。 解决&#xff1a;node_modules挂载到/workspace下&#xff0c;workingDir的代码mv到/workspace下进行构建。

MyBatis-Plus与PageHelper依赖的jsqlparser库冲突

问题 最近遇到的一个项目升级了SpringBoot到3.x版本了&#xff0c;同时也准备升级MyBatis-Plus&#xff0c;即使用如下依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><…

初级python代码编程学习----简单的图形化闹钟小程序

我们来创建一个简单的图形化闹钟程序通常需要使用图形用户界面&#xff08;GUI&#xff09;库。以下是使用Python的Tkinter库创建一个基本闹钟程序的步骤&#xff1a; 环境准备 确保已安装Python。安装Tkinter库&#xff08;Python 3.8及以上版本自带Tkinter&#xff0c;无需…

【代码】Swan-Transformer 代码详解(待完成)

1. 局部注意力 Window Attention (W-MSA Module) class WindowAttention(nn.Module):r""" Window based multi-head self attention (W-MSA) module with relative position bias.It supports both of shifted and non-shifted window.Args:dim (int): Number…

用户画像实时标签数据处理流程图

背景 在用户画像中&#xff0c;有一类实时标签&#xff0c;我们既要它能够实时的对外提供数据统计&#xff0c;也要保存到大数据组件中用于后续的对数&#xff0c;圈选的逻辑&#xff0c;本文就看一下用户画像的实时标签的数据流转图 实时标签数据流转图 首先我们肯定是要使…

独立站PrestaShop安装

独立站PrestaShop安装 独立站PrestaShop安装系统需求下载PrestaShop浏览器下载命令行下载 解压PrestaShop创建数据库移动PrestaShop源码到web目录composer安装依赖包nginx配置访问域名进入安装页面选择语言许可协议系统兼容性店铺信息Content of your store系统配置数据库店铺安…

书生大模型学习笔记9 - LMDeploy 量化部署

LMDeploy 量化部署 InternLM 2.5 20b量化前部署W4A16 模型量化量化模型部署streamlit web InternLM 2.5 20b量化前部署 lmdeploy serve api_server \/root/learning/InternLM/XTuner/merged_20b \--model-format hf \--quant-policy 0 \--cache-max-entry-count 0.01\--server…

数据结构与算法——图

1、为什么要有图 1&#xff09;前面我们学习了线性表和树 2&#xff09;线性表局限于一个直接前驱和一个直接后继的关系 3&#xff09;树也只能有一个直接前驱就是父节点 4&#xff09;当我们需要表示多对多的关系时&#xff0c;这里我们就用到了图 图是一种数据结构&#xf…

支持2.4G频秒变符合GB42590的标准的飞行器【无人机GB42590发射端】

使用方法: 放在飞机 上&#xff0c;按键那一面需要朝上对着天空(因为GPS陶瓷天线在按键面)&#xff0c;支持基本ID&#xff0c;向量和系统包&#xff0c;电池容量240mAH充电1小时&#xff0c;使用时间大概2小时。 1.长按3秒开关机 2.开机红灯慢闪&#xff0c;只发射基本ID数据…

JavaScript_7_练习:随机抽奖案例

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>练习&#xff1a;随机抽奖案例</tit…

【后续更新】python搜集上海二手房数据

源码如下: import asyncio import aiohttp from lxml import etree import logging import datetime import openpyxlwb = openpyxl.Workbook() sheet = wb.active sheet.append([房源, 房子信息, 所在区域, 单价, 关注人数和发布时间, 标签]) logging.basicConfig(level=log…

GD32双路CAN踩坑记录

GD32双路CAN踩坑记录 目录 GD32双路CAN踩坑记录1 问题描述2 原因分析3 解决办法4 CAN配置参考代码 1 问题描述 GD32的CAN1无法进入接收中断&#xff0c;收不到数据。 注&#xff1a;MCU使用的是GD32E50x&#xff0c;其他型号不确定是否一样&#xff0c;本文只以GD32E50x举例说…

CTF中的换表类Crypto题目

目录 [安洵杯 2019]JustBase[SWPUCTF 2021 新生赛]traditional字符替换解密 [BJDCTF 2020]base??字符替换 --》 base64解密 [安洵杯 2019]JustBase VGhlIGdlbxvZ#kgbYgdGhlIEVhcnRoJ#Mgc#VyZmFjZSBpcyBkb!pbmF)ZWQgYnkgdGhlIHBhcnRpY#VsYXIgcHJvcGVydGllcyBvZiB#YXRlci$gUHJ…

计量自动化终端上行通信规约

物理层 TCP 和 UDP 的传输接口 该类接口的登录链接和心跳检测采用链路测试服务&#xff0c;链路测试周期可设定。 参见 TCP/IP 协议规范。 串行通信传输接口 字节传输按异步方式进行&#xff0c;它包含 8 个数据位、1 个起始位“0”、1 个偶校验位 P 和 1 个停止位“1”。 …

测试流程自动化实践!

测试流程自动化的最佳实践涉及多个方面&#xff0c;旨在提高测试效率、确保测试质量&#xff0c;并降低测试成本。以下是一些关键的实践方法&#xff1a; 1. 明确测试目标 确定测试范围&#xff1a;在开始自动化测试之前&#xff0c;需要明确哪些功能、模块或场景需要被测试。…

共享内存及网络通信

共享内存 ------ 最高效的进程间通信 一个内核预留的空间&#xff0c;两进程绑定同一块共享空间 避免了用户空间 到 内核空间的数据拷贝 IPC 操作流程 key值 > 申请 >读写 >关闭 >卸载 1,产生key值 函数ftok key_t ftok(const char *pathname, int proj_id);…

Python 设置Excel工作表页边距、纸张大小/方向、打印区域、缩放比例

在使用Excel进行数据分析或报告制作时&#xff0c;页面设置是确保最终输出效果专业、美观的关键步骤。合理的页面设置不仅能够优化打印效果&#xff0c;还能提升数据的可读性。本文将详细介绍如何使用Python操作Excel中的各项页面设置功能。 目录 Python 设置Excel工作表页边…

调用大模型API-文心一言

一、准备工作 进入百度智能云千帆大模型平台&#xff0c;点击应用接入-创建应用&#xff1b;按提默认完成创建 二、开始使用 单轮调用 进入API列表 - ModelBuilder以第一个ERNIE-4.0-8K为例&#xff0c;选择“HTTP请求调用”&#xff0c;把第一步创建应用的 应用API Key、应…

汽车服务管理系统 _od8kr

TOC springboot580汽车服务管理系统 _od8kr--论文 系统概述 该系统由个人管理员和员工管理&#xff0c;用户三部分组成。其中&#xff1a;用户进入系统首页可以实现首页&#xff0c;热销汽车&#xff0c;汽车配件&#xff0c;汽车资讯&#xff0c;后台管理&#xff0c;在线客…