当前位置: 首页 > news >正文

QT实现tcp服务器客户端

服务器.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//实例化一个服务器server = new QTcpServer(this);// 此时,服务器已经成功进入监听状态,如果有客户端向服务器发来连接请求//那么该服务器,就会自动发射一个newConnection的信号,我们可以将该信号连接到对应槽函数中执行相关逻辑//由于只需要连接一次即可,所以可以将该连接放在构造函数中完成connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);}Widget::~Widget()
{delete ui;
}//启动服务器按钮对应的槽函数
void Widget::on_startBtn_clicked()
{quint16 port = ui->portEdit->text().toUInt();//监听客户端的连接请求//函数原型: bool listen(const QHostAddress &address = QHostAddress::Any,quint16 port = 0);//参数1:要监听的主机地址,如果是any表示监听任意一个主机地址,也可以是特定的主机地址//参数2:该服务器提供的端口号如果是0,表示有服务器指定,一般由程序员指定//返回值:成功进入坚挺状态,返回true,其他情况返回falseif(!server->listen(QHostAddress::Any, port)){QMessageBox::information(this, "失败", "监听失败");}else{QMessageBox::information(this, "成功", "监听成功");}
}//自定义处理newConnection信号的槽函数的实现
void Widget::newConnection_slot()
{qDebug()<<"您有新的客户端发来连接请求";//获取最新链接的客户端套接字//函数原型:virtual QTcpsocket *nextPendingconnection() ;//参数:无//返回值:最新连接过来的客户端套接字的地址QTcpSocket *s = server->nextPendingConnection();//将该套接字放入客户端链表中clientList.push_back(s);//至此,多个客户端已经跟付曲奇建立连接,并放入客户端容器中//此时。如果有客户端向服务器发来数据,那么对应的客户端套接字就会自动发射一个readyRead信号//我们可以将该信号连接到自定义的槽函数中,处理相关逻辑connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);}
//readyRead对应槽函数的实现
void Widget::readyRead_slot()
{qDebug()<<"有新消息来咯";//遍历客户端链表,将无效的客户端移除for(int i=0;i<clientList.size();i++){//判断当前套接字是否是有效连接//函数原型:Socketstate state() const;//参数:无//返回值:套接字的状态,如果是0,表示该套接字无效if(clientList[i]->state() == 0){//将该套接字移除客户端容器clientList.removeAt(i);}}//遍历客户端链表,判断是哪个客户端发来数据for (int i=0;i<clientList.size();i++){//函数原型 :qint64 bytesAvailable() const override;//求当前哭护短套接字中歹毒数据的字节数//参数:无//返回值:待读数据的字节数,如果是0,表示无数据待读if(clientList[i]->bytesAvailable() != 0){//将改套接字的数据读出来QByteArray msg = clientList[i]->readAll();//将数据展示到ui界面ui->msgwidget->addItem(QString::fromLocal8Bit(msg));//将接收到的数据转发给所有客户端for (int j=0;j<clientList.size();j++){clientList[j]->write(msg);}}}}

 客户端.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);ui->sendBtn->setEnabled(false);//给客户端指针实例化对象socket = new QTcpSocket(this);//此时,已经向服务器发送连接请求了,如果成功连接服务器,那么该客户端就会自动发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理逻辑//由于只需要连接一次,所以将连接写在构造函数中connect(socket, &QTcpSocket::connected, this, &Widget::connected_slot);//如果服务器向客户端发来消息,那么该客户端就会自动发射一个readyRead信号//我们可以将该进行连接到自定义的槽函数中处理相关逻辑connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);//当成功与服务器断开连接后,该客户端会自动发射一个disconnected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑//由于该连接只需连接一次即可,所以放在构造函数中进行connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_connectBtn_clicked()
{//获取ui界面上的相关信息userName = ui->userNameEdit->text();         //获取用户名QString ip = ui->ipEdit->text();            //主机地址quint16 port = ui->portEdit->text().toUInt();        //端口号//函数原型:virtual void connectToHost(const QHostAddress &address, quint16 port);//功能:将客户端连接到给定的服务器//参数1:服务器的主机地址//参数2:端口号//返回值:无socket->connectToHost(ip, port);//此时,已经向服务器发送连接请求了,如果成功连接服务器,那么该客户端就会自动发射一个connected的信号//我们可以将该信号连接到自定义的槽函数中处理逻辑//由于只需要连接一次,所以将连接写在构造函数中ui->msgEdit->setEnabled(true);//设置消息编辑器为可用状态ui->ipEdit->setEnabled(false);//设置ip编辑器为不可以状态ui->portEdit->setEnabled(false);ui->userNameEdit->setEnabled(false);ui->sendBtn->setEnabled(true);//设置发送按钮为可用状态ui->disconnectBtn->setEnabled(true);}//处理connected信号的槽函数的定义
void Widget::connected_slot()
{QMessageBox::information(this, "成功", "您已经成功进入聊天室");//向服务器发送一条数据:***:进入聊天室QString msg = userName +": 进入聊天室";socket->write(msg.toLocal8Bit());          //将数据写给服务器
}//处理readyRead信号的槽函数的定义
void Widget::readyRead_slot()
{//读取套接字中的信息QByteArray msg = socket->readAll();//将数据展示到ui界面ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
}//发送按钮对应的槽函数
void Widget::on_sendBtn_clicked()
{//获取ui界面输入的内容QString msg =userName+ ": " + ui->msgEdit->text();//发送给服务器socket->write(msg.toLocal8Bit());//清空编辑框内容ui->msgEdit->clear();
}//断开服务器按钮对应的槽函数
void Widget::on_disconnectBtn_clicked()
{//告诉大家我走了QString msg = userName +": 离开聊天室";socket->write(msg.toLocal8Bit());//断开连接//函数原型: virtual void disconnectFromHost();socket->disconnectFromHost();//当成功与服务器断开连接后,该客户端会自动发射一个disconnected的信号//我们可以将该信号连接到自定义的槽函数中处理相关逻辑//由于该连接只需连接一次即可,所以放在构造函数中进行ui->ipEdit->setEnabled(true);ui->portEdit->setEnabled(true);ui->userNameEdit->setEnabled(true);ui->disconnectBtn->setEnabled(false);ui->msgEdit->setEnabled(false);ui->sendBtn->setEnabled(false);
}//disconnected信号对应槽函数的定义
void Widget::disconnected_slot()
{QMessageBox::information(this, "提示", "退出成功");
}

相关文章:

QT实现tcp服务器客户端

服务器.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);// 此时&#xff0c;服务器已经成功进入监听状态…...

tcp拥塞控制原理

18.3 拥塞控制 我们在向对端发送数据时&#xff0c;并不是一股脑子任意发送&#xff0c;因为TCP建立连接后&#xff0c;就是建立了一根管道&#xff0c;这跟管道上&#xff0c;实际上有很多的工作设备&#xff0c;比如路由器和交换机等等&#xff0c;他们都会对接收到的TCP包进…...

【C++设计模式之简单工厂模式】分析及示例

简介 简单工厂模式是一种常见的设计模式&#xff0c;用于创建多种相似对象的实例&#xff0c;属于创建型。 它通过一个工厂类来解耦客户端代码和对象的创建过程&#xff0c;使得客户端无需直接和具体的产品类交互&#xff0c;而只需要通过工厂类获取所需的产品实例即可。 原理…...

云原生定义整理

云原生定义整理 Pivotal 是云原生应用的提出者&#xff0c;并推出了 Pivotal Cloud Foundry 云原生应用平台和 Spring 开源 Java 开发框架&#xff0c;成为云原生应用架构中先驱者和探路者。 Pivotal最初的定义 Pivotal公司的Matt Stine在2015年写了一本叫做<<迁移到云…...

华硕X555YI, Win11下无法调节屏幕亮度

翻出一个旧电脑华硕X555YI&#xff0c;装Win11玩&#xff0c;已经估计到会有一些问题。 果然&#xff0c;装完之后&#xff0c;发现屏幕无法调节亮度。试了网上的一些方法&#xff0c;比如修改注册表等&#xff0c;无效。 估计是显卡比较老&#xff0c;哪里没兼容。然后用驱动…...

踩坑 | vue动态绑定img标签src属性的一系列报错

文章目录 踩坑 | vue项目运行后使用require()图片也不显示问题描述vue中动态设置img的src不生效问题的原因require is not defined 解决办法1&#xff1a;src属性直接传入地址解决办法2 踩坑 | vue项目运行后使用require()图片也不显示 问题描述 在网上查阅之后&#xff0c;发…...

强化学习环境 - robogym - 学习 - 1

强化学习环境 - robogym - 学习 - 1 项目地址 https://github.com/openai/robogym 为什么选择 robogym 自己的项目需要做一些机械臂 table-top 级的多任务操作 robogym 基于 mujoco 搭建&#xff0c;构建了一个仿真机械臂桌面物体操作&#xff08;pick-place、stack、rearr…...

如果在 Mac 上的 Safari 浏览器中无法打开网站

使用网络管理员提供的信息更改代理设置。个人建议DNS解析&#xff0c;设置多个例如114.114.114.114 8.8.8.8 8.8.4.4 如果打不开网站&#xff0c;请尝试这些建议。 在 Mac 上的 Safari 浏览器 App 中&#xff0c;检查页面无法打开时出现的信息。 这可能会建议解决问题的…...

力扣练习——链表在线OJ

目录 提示&#xff1a; 一、移除链表元素 题目&#xff1a; 解答&#xff1a; 二、反转链表 题目&#xff1a; 解答&#xff1a; 三、找到链表的中间结点 题目&#xff1a; 解答&#xff1a; 四、合并两个有序链表&#xff08;经典&#xff09; 题目&#xff1a; 解…...

四、互联网技术——局域网拓扑结构

文章目录 一、局域网拓扑结构二、虚拟局域网VLAN三、交换机VLAN划分四、VLAN的作用五、交换机的端口类型六、经典三层网络架构七、例题:局域网带宽利用分析八、网络安全基础九、恶意软件十、防火墙与入侵检测技术 一、局域网拓扑结构 局域网的主要特征由网络的拓扑结构、所采用…...

Spring Webflux DispatcherHandler源码整理

DispatcherHandler的构造(以RequestMappingHandlerMapping为例) WebFluxAutoConfiguration中EnableWebFluxConfiguration继承WebFluxConfigurationSupportBean public DispatcherHandler webHandler() {return new DispatcherHandler(); }DispatcherHandler#setApplicationCon…...

【Netty】ByteToMessageDecoder源码解析

目录 1.协议说明 2.类的实现 3.Decoder工作流程 4.源码解析 4.1 ByteToMessageDecoder#channelRead 4.2 累加器Cumulator 4.3 解码过程 4.4 Decoder实现举例 5. 如何开发自己的Decoder 1.协议说明 Netty框架是基于Java NIO框架&#xff0c;性能彪悍&#xff0c;支持的协…...

DevEco Studio设置Nodejs提示路径只能包含英文、数字、下划线等

安装DevEco Studio 3.1.1 Release 设置Nodejs路径使用nodejs默认安装路径 &#xff08;C:\Program Files\nodejs&#xff09; 提示只能包含英文、数字、下划线等 , 不想在安装nodejs请往下看 nodejs默认路径报错 修改配置文件 1、退出DevEco Studio 2、打开配置文件 cmd控制台…...

大模型 Decoder 的生成策略

本文将介绍以下内容&#xff1a; IntroductionGreedy Searchbeam searchSamplingTop-K SamplingTop-p (nucleus) sampling总结 一、Introduction 1、简介 近年来&#xff0c;由于在数百万个网页数据上训练的大型基于 Transformer 的语言模型的兴起&#xff0c;开放式语言生…...

队列和栈相互实现

相关题目 225. 用队列实现栈&#xff1a;弹出元素时&#xff0c;将对首的元素出列加到队尾&#xff0c;直到只剩下初始队列时队尾一个元素为止&#xff0c;然后弹出这个元素&#xff0c;即可实现LIFO 232. 用栈实现队列&#xff1a;用两个栈实现队列的功能&#xff0c;出栈时&a…...

Node.js 是如何处理请求的

前言&#xff1a;在服务器软件中&#xff0c;如何处理请求是非常核心的问题。不管是底层架构的设计、IO 模型的选择&#xff0c;还是上层的处理都会影响一个服务器的性能&#xff0c;本文介绍 Node.js 在这方面的内容。 TCP 协议的核心概念 要了解服务器的工作原理首先需要了…...

数据结构与算法之堆: Leetcode 215. 数组中的第K个最大元素 (Typescript版)

数组中的第K个最大元素 https://leetcode.cn/problems/kth-largest-element-in-an-array/ 描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。…...

SpringBoot快速入门

搭建SpringBoot工程&#xff0c;定义hello方法&#xff0c;返回“Hello SpringBoot” ②导入springboot工程需要继承的父工程&#xff1b;以及web开发的起步依赖。 ③编写Controller ④引导类就是SpringBoot项目的一个入口。 写注解写main方法调用run方法 快速构建SpringBoo…...

深度学习笔记_4、CNN卷积神经网络+全连接神经网络解决MNIST数据

1、首先&#xff0c;导入所需的库和模块&#xff0c;包括NumPy、PyTorch、MNIST数据集、数据处理工具、模型层、优化器、损失函数、混淆矩阵、绘图工具以及数据处理工具。 import numpy as np import torch from torchvision.datasets import mnist import torchvision.transf…...

高效的开发流程搭建

目录 1. 搭建 AI codebase 环境kaggle的服务器1. 搭建 AI codebase 环境 python 、torch 以及 cuda版本,对AI的影响最大。不同的版本,可能最终计算出的结果会有区别。 硬盘:PCIE转SSD的卡槽,, GPU: 软件源: Anaconda: 一定要放到固态硬盘上。 VS code 的 debug功能…...

VS Code 高效开发:从 launch.json 变量替换到 task.json 自动化构建

1. 从零开始配置 VS Code 调试环境 第一次打开 VS Code 的调试面板时&#xff0c;很多开发者都会感到无从下手。其实配置调试环境并不复杂&#xff0c;关键是要理解 launch.json 文件的作用。这个文件就像是调试器的"说明书"&#xff0c;告诉 VS Code 如何启动和连接…...

Zotero PDF Translate终极配置指南:如何一键激活20+翻译服务

Zotero PDF Translate终极配置指南&#xff1a;如何一键激活20翻译服务 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: https://gitcode.com/gh_mir…...

Audacity音频编辑完全手册:从零开始制作专业音频作品

Audacity音频编辑完全手册&#xff1a;从零开始制作专业音频作品 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 想制作播客却不知道如何剪辑&#xff1f;需要为视频添加背景音乐但找不到合适的工具&#xff1f;或…...

【Midjourney Sumi-e风格创作终极指南】:20年AI绘画专家亲授3大笔触控制法则、5类水墨失真避坑清单与实时渲染参数配置表

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Sumi-e水墨美学与AI生成的本体论契合 留白即存在 水墨画中的“余白”并非空无&#xff0c;而是气韵流转的场域——这与生成式AI中隐空间&#xff08;latent space&#xff09;的拓扑结构惊人地同构。扩…...

AI智能体技能超市:用SKILL.md标准打破AI能力壁垒

1. 项目概述&#xff1a;一个为AI智能体准备的“技能超市” 如果你和我一样&#xff0c;每天都在和各种AI编程助手打交道——Cursor、Claude Code、GitHub Copilot&#xff0c;那你肯定也遇到过这样的场景&#xff1a;想让AI帮你生成一张产品原型图&#xff0c;结果它告诉你“我…...

科研绘图升级:用CMplot为你的基因组文章制作高颜值SNP密度图(R实战)

科研绘图升级&#xff1a;用CMplot为你的基因组文章制作高颜值SNP密度图&#xff08;R实战&#xff09; 在基因组学研究中&#xff0c;数据可视化不仅是结果展示的手段&#xff0c;更是科学叙事的重要语言。一张精心设计的SNP密度图&#xff0c;能够直观呈现全基因组范围内单核…...

Jira、ONES、ClickUp 对比:哪款研发管理软件更适合中国研发团队?

快速迭代的互联网和软件行业&#xff0c;研发团队的效率管理工具几乎决定了产品交付的速度与质量。研发管理软件不仅是“任务分派”的工具&#xff0c;更是团队 需求管理、版本迭代、缺陷跟踪、研发效能度量 的基础设施。 目前市面上主流的研发管理软件众多&#xff0c;不同工…...

Qt界面嵌入Halcon窗口实战:告别弹窗,实现图像控件一体化显示

Qt与Halcon深度整合&#xff1a;实现无缝图像控件嵌入的工程实践 在工业视觉和医疗影像处理领域&#xff0c;Qt框架与Halcon图像处理库的结合堪称黄金搭档。但许多开发者初次尝试这种混合开发时&#xff0c;都会遇到一个恼人的问题——Halcon的显示窗口总是顽固地以独立弹窗形式…...

VS2019编译OpenSceneGraph 3.6.5踩坑全记录:从CMake配置到解决第三方库缺失

VS2019编译OpenSceneGraph 3.6.5实战避坑指南 第一次在Windows平台用VS2019编译OpenSceneGraph 3.6.5时&#xff0c;我原以为按照官方文档就能轻松搞定。直到CMake报出一连串第三方库缺失的红色警告&#xff0c;才意识到这趟编译之旅远没有想象中简单。如果你也正对着Could NOT…...

拒绝无效熬夜!Paperxie 本科论文智能写作,把毕业季还给你

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 凌晨三点的图书馆&#xff0c;光标在空白文档里闪了又闪&#xff0c;Word 字数统计停在 478&#xff1b;导师的修…...