Qt服务器端与客户端交互

news2024/11/16 23:41:41

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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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,错误返回false
    if(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.coloradmin.cn/o/1643139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32入门学习之ADC

1.ADC在STM32进行数据采集时十分重要。通过ADC可以将外界的数字信号转换为模拟信号&#xff0c;以满足采样的需求。(资料参考于正点原子) STM32 拥有 1~3 个 ADC &#xff08; STM32F101/102 系列只有 1 个 ADC &#xff09;&#xff0c;这些 ADC 可以独立使用&#…

《老相册》读后感

外面在下着瓢泼大雨&#xff0c;豆粒大的雨点打在窗户上&#xff0c;发出啪啪的巨响。这样的雨天&#xff0c;是不适宜外出的&#xff0c;最惬意的方式就是一个人待在宿舍里&#xff0c;打开一本书&#xff0c;慢慢地看&#xff0c;静静地想&#xff0c;让所有的烦恼融化在这雨…

数据结构学习/复习7--栈的实现/括号匹配练习题/队列的实现/队列实现栈练习

一、栈 1.概念及性质 2.栈的实现(top0版) 注意事项&#xff1a;top也可初始为-1,代码需要调整 二、栈练习 1.括号匹配 三、队列 1.概念及性质 2、队列的实现 四、队列练习 1.两个队列实现栈

从零开始学AI绘画,万字Stable Diffusion终极教程(四)

【第4期】图生图 欢迎来到SD的终极教程&#xff0c;这是我们的第四节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在前面的课程中&#xff0c;我…

动手写一个简单的Android 表格控件支持固定列

Android 动手写一个简洁版表格控件 简介 源码已放到 Github Gitee 作为在测绘地理信息行业中穿梭的打工人&#xff0c;遇到各种数据采集需求&#xff0c;既然有数据采集需求&#xff0c;那当然少不了数据展示功能&#xff0c;最常见的如表格方式展示。 当然&#xff0c;类似…

论文辅助笔记:TimeLLM

1 __init__ 2 forward 3 FlattenHead 4 ReprogrammingLayer

Go 语言基础(一)【基本用法】

前言 最近心情格外不舒畅&#xff0c;不仅仅是对前途的迷茫&#xff0c;这种迷茫倒是我自己的问题还好&#xff0c;关键它是我们这种普通吗喽抗衡不了的。 那就换个脑子&#xff0c;学点新东西吧&#xff0c;比如 Go&#xff1f; 1、Go 语言入门 介绍就没必要多说了&#xff0…

vue快速入门(五十四)$nextTick的使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容 $nextTick的使用场景演示 源码 App.vue <template><div id"app"><h3>{{name}}</h3><button click"showfixed">修改</button><form action"post" v-s…

Git常用(持续更新)

常用场景&#xff1a; 初始化&#xff1a; git config --global user.name "codelabs" git config --global user.email mycodelabs.com git init git remote add origin https://github.com/username/repository.git git pull origin master 提交&#xff1a; gi…

设计模式: 责任链模式

目录 一&#xff0c;责任链模式 二&#xff0c;特点 四&#xff0c;实现步骤 五&#xff0c;代码 一&#xff0c;责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种软件设计模式&#xff0c;它属于行为型模式。在这种模式中&#xff0c…

2024五一赛数学建模A题B题C题完整思路+数据代码+参考论文

A题 钢板最优切割路径问题 &#xff08;完整资料在文末获取&#xff09; 1. 建立坐标系和表示方法&#xff1a; 在建模之前&#xff0c;我们需要将切割布局转换为数学表示。首先&#xff0c;我们可以将布局中的每个点表示为二维坐标系中的一个点。例如&#xff0c;B1可以表示…

【吊打面试官系列】Java高并发篇 - Thread 类中的 yield 方法有什么作用?

大家好&#xff0c;我是锋哥。今天分享关于 【Thread 类中的 yield 方法有什么作用&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Thread 类中的 yield 方法有什么作用&#xff1f; 使当前线程从执行状态&#xff08;运行状态&#xff09;变为可执行态&#x…

【数据结构(邓俊辉)学习笔记】列表04——排序器

文章目录 0. 统一入口1. 选择排序1.1 构思1.2 实例1.3 实现1.4 复杂度 2. 插入排序2.1 构思2.2 实例2.3 实现2.4 复杂度分析2.5 性能分析 3. 归并排序3.1 二路归并算法3.1.1 二路归并算法原理3.1.2 二路归并算法实现3.1.3 归并时间 3.2 分治策略3.2.1 实现3.2.2 排序时间 4. 总…

源支付V7开源版,源支付开源版,已去除安装扩展

源支付V7开源版&#xff0c;源支付开源版&#xff0c;已去除安装扩展 上传源码 设置伪静态 已去除安装扩展&#xff0c;直接上传就可以安装 开源版通道少了好几个 视频教程&#xff1a;https://www.bilibili.com/video/BV1mZ42177VY/

基于OpenCV-DNN的YOLOv9目标检测实现

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

力扣打卡第二天

206. 反转链表 class Solution { public:ListNode* reverseList(ListNode* head) {// //迭代法// ListNode *pre nullptr;// ListNode *curr head;// while(curr){// ListNode *next curr -> next;// curr -> next pre;// pre curr;// curr next;/…

【实时数仓架构】方法论

笔者不是专业的实时数仓架构&#xff0c;这是笔者从其他人经验和网上资料整理而来&#xff0c;仅供参考。写此文章意义&#xff0c;加深对实时数仓理解。 一、实时数仓架构技术演进 1.1 四种架构演进 1&#xff09;离线大数据架构 一种批处理离线数据分析架构&#xff0c;…

SFOS1:开发环境搭建

一、简介 最近在学习sailfish os的应用开发&#xff0c;主要内容是QmlPython。所以&#xff0c;在开发之前需要对开发环境&#xff08;virtualBox官方SDKcmake编译器python&#xff09;进行搭建。值得注意的是&#xff0c;我的开发环境是ubuntu22.04。如果是windows可能大同小异…

ZooKeeper以及DolphinScheduler的用法

目录 一、ZooKeeper的介绍 数据模型 ​编辑 操作使用 ①登录客户端 ​编辑 ②可以查看下面节点有哪些 ③创建新的节点&#xff0c;并指定数据 ④查看节点内的数据 ⑤、删除节点及数据 特殊点&#xff1a; 运行机制&#xff1a; 二、DolphinScheduler的介绍 架构&#…

回溯法——(1)装载问题(C语言讲解)

目录 一、装载问题 1.问题概括&#xff1a; 2.解决方案&#xff08;思路&#xff09;&#xff1a; 3.图片讲解&#xff08;超详细&#xff09;&#xff1a; 4.代码分析&#xff1a; 二、算法改进&#xff1a;引入上界函数 1.问题概念&#xff1a; 2.图片讲解&#xff1a…