Qt服务器端与客户端交互

embedded/2024/11/14 21:54:00/

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());//丽丽
}

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


http://www.ppmy.cn/embedded/33221.html

相关文章

潮玩宇宙大逃杀平台app

潮玩宇宙大逃杀平台功能介绍 潮玩宇宙大逃杀平台是一款独特且充满挑战的在线多人游戏平台&#xff0c;为玩家提供了一个充满奇幻与刺激的宇宙逃亡之旅。以下是该平台的主要功能介绍&#xff1a; 独特的游戏设定&#xff1a;潮玩宇宙大逃杀平台设定在一个庞大的宇宙中&#xf…

什么是日志审计系统?日志审计系统有什么用?

日志审计系统是一种关键的信息安全和网络管理工具&#xff0c;它通过收集、分析和存储计算机系统、网络和应用程序产生的日志信息来帮助组织监控其信息系统的安全状态&#xff0c;检测异常行为&#xff0c;以及遵守各种合规要求。这些系统对于维护系统的完整性和安全性、识别和…

如何在Dlib库中实现目标跟踪

dlib 库本身并不直接提供目标跟踪的功能。dlib 是一个包含机器学习算法的 C++ 工具包,其中包含如人脸检测、人脸关键点检测、形状预测等功能,但它没有内置的目标跟踪算法。 但是,你可以结合其他库或自己实现算法来在 dlib 的基础上进行目标跟踪。以下是一个大致的步骤,指导…

JavaEE初阶Day 15:文件IO(1)

目录 Day 15&#xff1a;文件IO&#xff08;1&#xff09;IO文件1. 路径2. 文件的分类3. 使用Java针对文件系统进行操作3.1 属性3.2 构造方法3.3 方法 Day 15&#xff1a;文件IO&#xff08;1&#xff09; IO I&#xff1a;Input输入 O&#xff1a;Output输出 输入输出规则…

Summary of Common Interview Questions of SpringMVC

1. What is Spring MVC? Briefly introduce your understanding of spring MVC? Spring MVC is a lightweight web framework based on Java that implements the request driven type of MVC design pattern. By separating Model, View and Controller, it decouples the …

零基础学习数据库SQL语句之查询表中数据的DQL语句

是用来查询数据库表的记录的语句 在SQL语句中占有90%以上 也是最为复杂的操作 最为繁琐的操作 DQL语句很重要很重要 初始化数据库和表 USE dduo;create table tb_emp(id int unsigned primary key auto_increment comment ID,username varchar(20) not null unique comment…

C++入门系列-类和对象(上)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 面向对象和面向过程初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数来逐步解决问题。 C是面向对象的&#xff0c;…

《苍穹外卖》前端课程知识点记录

一、VUE基础知识 基于脚手架创建前端工程 1. 环境要求 安装node.js&#xff1a;Node.js安装与配置&#xff08;详细步骤&#xff09;_nodejs安装及环境配置-CSDN博客查看node和npm的版本号 安装Vue CLI&#xff1a;Vue.js安装与创建默认项目&#xff08;详细步骤&#xff09;…