Qt服务器端与客户端交互

Qt做客户端与服务器端交互第一步引入network

第一步引入network后继续编程首先界面设计

创建server和socket

引入QTcpServer,QTcpSocket

MainWindow.h代码如下

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();QTcpServer *tcpserver;QTcpSocket *tcpsocket;QList<QTcpSocket*> listClient;void onButtonClicked();void onButtonClicked1();
private slots:void on_connectbt_clicked();void on_disconnectbt_clicked();void on_sendbt_clicked();void newConnection_Slot();void readyRead_Slot();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

然后绑定IP和端口号:

tcpserver->listen(QHostAddress::Any,ui->portnum->text().toUInt());//监听端口号
    qDebug()<<"服务器已经打开;端口号是"<<ui->portnum->text();
tcpserver=new QTcpServer(this);
    tcpsocket=new QTcpSocket(this);
    connect(tcpserver,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));

服务器端代码MainWindow.cpp如下,包括socket连接,读,写

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QComboBox>
#include<QLineEdit>
#include<QPushButton>
#include<QTcpSocket>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);tcpserver=new QTcpServer(this);tcpsocket=new QTcpSocket(this);connect(tcpserver,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::on_sendbt_clicked);connect(ui->pushButton_2, &QPushButton::clicked, this, &MainWindow::on_connectbt_clicked);connect(ui->pushButton_3, &QPushButton::clicked, this, &MainWindow::on_disconnectbt_clicked);connect(ui->pushButton_4, &QPushButton::clicked, this, &MainWindow::onButtonClicked);connect(ui->pushButton_5, &QPushButton::clicked, this, &MainWindow::onButtonClicked1);//connect(ui->pushButton_3, &QPushButton::clicked, this, &MainWindow::on_disconnectbt_clicked);
}
//单发命令void MainWindow::newConnection_Slot(){tcpsocket=tcpserver->nextPendingConnection();listClient.append(tcpsocket);qDebug() << listClient.count();//qDebug() << tcpsocket;ui->comboBox->addItem("客户端"+QString::number(listClient.count())+"号");//for(int i=0;i<listClient.count();i++)//{//tcpsocket=listClient.at(i);qDebug()<<tcpsocket;//connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));connect(tcpsocket, &QTcpSocket::readyRead,[=](){//从通信套接字中取出内容QString buf;buf=tcpsocket->readAll();ui->receivewd->append(buf);});//}
}
void MainWindow::readyRead_Slot()
{//第四步:读取套接字的内容//从socket中读出数据QString buf;buf=tcpsocket->readAll();ui->receivewd->append(buf);/*或QByteArray baArray = tcpsocket->readAll();QString sMsg = baArray;ui->receivewd->appendPlainText(receivewd);*/
}
void MainWindow::on_connectbt_clicked()//连接服务器
{//第二部步:listen------监听是否有新的连接进来tcpserver->listen(QHostAddress::Any,ui->portnum->text().toUInt());//监听端口号qDebug()<<"服务器已经打开;端口号是"<<ui->portnum->text();
}
void MainWindow::on_disconnectbt_clicked()//关闭服务器
{tcpserver->close();
}void MainWindow::on_sendbt_clicked()//发送信息
{
//    toLatin1()
//    tcpsocket->write(ui->sendwd->text().toLatin1());
//    tcpsocket->write(ui->sendwd->text().toLocal8Bit(),ui->sendwd->text().length());for(int i=0;i<listClient.count();i++){tcpsocket=listClient.at(i);tcpsocket->write(ui->sendwd->text().toLocal8Bit().data());}
}
MainWindow::~MainWindow()
{delete ui;
}

客户端代码如下:客户端界面

MainWindow.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();QTcpSocket *tcpsocket;
private slots:void on_openclient_clicked();void connected_SLOT();void readyRead_Slot();void on_closeclient_clicked();void on_sent_clicked();
private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

客户端代码MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);tcpsocket=new QTcpSocket(this);connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::on_sent_clicked);connect(ui->pushButton_2, &QPushButton::clicked, this, &MainWindow::on_openclient_clicked);connect(ui->pushButton_3, &QPushButton::clicked, this, &MainWindow::on_closeclient_clicked);
}MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::connected_SLOT()
{QObject::connect(tcpsocket, &QTcpSocket::readyRead, this, &MainWindow::readyRead_Slot);
//    connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));//将信号连接到槽,书写比较明确}
void MainWindow::readyRead_Slot()//定义接收信号的槽
{QString buf;buf=tcpsocket->readAll();int num=buf.toInt();switch(num){case 1:break;}ui->receivewd->append(buf);//接收由tcp发送过来的信息
//    ui->receivewd->appendPlainText(buf.toUtf8());//接收由tcp发送过来的信息
}void MainWindow::on_openclient_clicked()
{//第一步:创建套接字,与服务端的IP地址和端口号连接.//注:这里的端口号和上面服务端绑定的那个端口号是一样的,别搞错了.//连接服务端tcpsocket->connectToHost(ui->ipnum->text(),ui->portnum->text().toInt());//转为无符号,连接服务器端口connect(tcpsocket,SIGNAL(connected()),this,SLOT(connected_SLOT()));qDebug() << "连接服务器端成功IP是"<<ui->ipnum->text()<<"端口号是:"<<ui->portnum->text();/*//成功连接返回true,错误返回falseif(m_tsTcpSocket->waitForConnected()){qDebug() << "connect success";}*/
}void MainWindow::on_closeclient_clicked()
{tcpsocket->close();printf("关闭客户端 ");
}void MainWindow::on_sent_clicked()
{tcpsocket->write(ui->sendwd->text().toLocal8Bit().data(),ui->sendwd->text().length());//丽丽
}

客户端与服务器端交互,主要就是连接,读和写内容。

Qt入门到精通网址Qt开发基础——Qt跨平台GUI原理机制_哔哩哔哩_bilibili

MessageBox点击按钮的不同事件

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

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

相关文章

Cisco WLC 2504控制器重启后所有AP掉线故障-系统日期时间

1 故障描述 现场1台WLC 2504控制器掉电重启后&#xff0c;所有AP均无线上线&#xff0c; 正常时共有18个AP在线&#xff0c;而当前为0 AP在线数量为0 (Cisco Controller) >show ap sumNumber of APs.................................... 0Global AP User Name..........…

LeetCode 106.从中序与后序遍历序列构造二叉树

LeetCode 106.从中序与后序遍历序列构造二叉树 1、题目 题目链接&#xff1a;106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并…

SSM【Spring SpringMVC Mybatis】——Mybatis

目录 1、初识Mybatis 1.1Mybatis简介 1.2 官网地址 2、搭建Mybatis框架 2.1 准备 2.2 搭建Mybatis框架步骤 1. 导入jar包 2. 编写核心配置文件【mybatis-config.xml】 3. 书写相关接口及映射文件 4. 测试【SqlSession】 2.3 添加Log4j日志框架 导入jar包 编写配置文…

hive日常使用时忘记部分补充(不定时)

1、date_formate、unix_timestamp、from_unixtime用法&#xff1a; 2、lag&#xff08;&#xff09;、lead()用法&#xff1a; lag&#xff08;)窗口函数返回分区中当前行之前行&#xff08;可以指定第几行&#xff09;的值。 如果没有行&#xff0c;则返回null。 lead()窗口…

搭建Docker私服镜像仓库Harbor

1、概述 Harbor是由VMware公司开源的企业级的Docker Registry管理项目&#xff0c;它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。 Harbor 的所有组件都在 Dcoker 中部署&#xff0c;所以 Harbor 可使用 Docker Compose 快速部署。 …

C++ | Leetcode C++题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution { public:int removeDuplicates(vector<int>& nums) {int n nums.size();if (n < 2) {return n;}int slow 2, fast 2;while (fast < n) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slo…

C++:类与对象—继承

类与对象—继承 一、继承是什么&#xff1f;二、继承定义三、基类和派生类对象赋值转换四、继承中的作用域五、派生类的默认成员函数六、继承与友元七、继承与静态成员八、复杂的菱形继承及菱形虚拟继承九、继承的总结和反思十、考察重点 一、继承是什么&#xff1f; 继承(inh…

Flutter-Statewidget 创建State过程State<XXXX> createState() => _XXXXState()的解释

文章目录 创建widget 的状态对象示例代码解析 完整的代码示例总结 创建widget 的状态对象 今天有个同学问了我下State createState() > _XXXXState()时什么意思。这个代码在flutter开发中一直看到&#xff0c;很多人都不关心这个&#xff0c;直接当模板使用。今天来介绍下这…

[Cmake Qt]找不到文件ui_xx.h的问题?有关Qt工程的问题,看这篇文章就行了。

前言 最近在开发一个组件&#xff0c;但是这个东西是以dll的形式发布的界面库&#xff0c;所以在开发的时候就需要上层调用。 如果你是很懂CMake的话&#xff0c;ui_xx.h的文件目录在 ${CMAKE_CURRENT_BINARY_DIR} 下 然后除了有关这个ui_xx.h&#xff0c;还有一些别的可以简…

如何选择合适加密软件来保护信息资产|精选加密软件分析

五款加密软件对比分析&#xff0c;是一项复杂而必要的任务&#xff0c;旨在帮助用户选择最适合其需求的加密工具。在数字化时代&#xff0c;信息安全显得尤为重要&#xff0c;因此&#xff0c;对加密软件的评估与比较显得尤为关键。 首先&#xff0c;我们要考虑的是这些加密软件…

【2024亚马逊云科技峰会】Amazon Bedrock + Llama3 生成式AI实践

在 4 月 18 日&#xff0c;Meta在官网上公布了旗下最新大模型Llama 3。目前&#xff0c;Llama 3已经开放了80亿&#xff08;8B&#xff09;和700亿&#xff08;70B&#xff09;两个小参数版本&#xff0c;上下文窗口为8k&#xff0c;据称&#xff0c;通过使用更高质量的训练数据…

考情分析 | 2025年西北工业大学计算机考研考情分析!

西北工业简称西工大&#xff08;英文缩写NPU&#xff09;&#xff0c;大学坐落于古都西安&#xff0c;是我国唯一一所以同时发展航空、航天、航海工程教育和科学研究为特色&#xff0c;以工理为主&#xff0c;管、文、经、法协调发展的研究型、多科性和开放式的科学技术大学。十…

使用Selenium破解滑动验证码的原理及解决思路

1、获取页面元素信息&#xff1a; 使用Selenium打开目标网页&#xff0c;并通过相关方法获取滑块、背景图等元素的位置和属性信息。可以使用Selenium提供的定位方法&#xff08;如xpath、CSS选择器等&#xff09;来找到这些元素。 可以使用find_element_by_xpath或find_elemen…

Wix打包后安装包直接签名安装失败原因

生成的游戏启动器wix安装包直接打包后进行签名安装会失败&#xff0c;看安装日志显示的错误为 Failed to extract all files from container, erf: 1:2:0 网上搜到的解决方案 需要用insignia工具解包&#xff0c;解包后的文件签一次名&#xff0c;再打一次包&#xff0c;再…

AI伦理和安全风险管理终极指南

人工智能&#xff08;AI&#xff09;正在迅速改变各个领域的软件开发和部署。驱动这一转变的两个关键群体为人工智能开发者和人工智能集成商。开发人员处于创建基础人工智能技术的最前沿&#xff0c;包括生成式人工智能&#xff08;GenAI&#xff09;模型、自然语言处理&#x…

Navicat Data Modeler Ess for Mac:强大的数据库建模设计软件

Navicat Data Modeler Ess for Mac是一款专为Mac用户设计的数据库建模与设计工具&#xff0c;凭借其强大的功能和直观的界面&#xff0c;帮助用户轻松构建和管理复杂的数据库模型。 Navicat Data Modeler Ess for Mac v3.3.17中文直装版下载 这款软件支持多种数据库系统&#x…

【电路笔记】-无源高通滤波器

无源高通滤波器 文章目录 无源高通滤波器1、概述2、一阶高通滤波器的频率响应3、高通滤波器示例4、二阶高通滤波器5、RC 差异化因素高通滤波器与低通滤波器电路完全相反,因为这两个组件已互换,滤波器输出信号现在从电阻器两端获取。 1、概述 由于低通滤波器只允许低于其截止…

户籍管理系统的设计与实现

【免费】户籍管理系统的设计与实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89296790 ​​​​​​​户籍管理系统的设计与实现 摘 要 当今社会人们生活质量越来越高&#xff0c;人们对生活品质的追求不断提升&#xff0c;对于孩子求学&#xff0c;变更住…

interview_bak

flink内存管理 JVM 存在的几个问题: Java 对象存储密度低。一个只包含 boolean 属性的对象占用了16个字节内存:对象头占了8个,boolean 属性占了1个,对齐填充占了7个。而实际上只需要一个bit(1/8字节)就够了。Full GC 会极大地影响性能,尤其是为了处理更大数据而开了很大…

java-函数式编程-jdk

背景 函数式接口很简单&#xff0c;但是不是每一个函数式接口都需要我们自己来写jdk 根据 有无参数&#xff0c;有无返回值&#xff0c;参数的个数和类型&#xff0c;返回值的类型 提前定义了一些通用的函数式接口 IntPredicate 参数&#xff1a;有一个&#xff0c;类型是int类…