基于QT实现的TCP连接的网络通信(客户端)

news2025/1/10 6:10:19

上篇介绍了QT实现网络通信的服务器端,还没看服务器的朋友们先去上篇了解,这篇我来实现一下客户端的实现。

首先还是新建一个项目

选择mainwindow类

在通信前将.pro文件的第一行代码中追加network

窗口搭建

在mainwindow.ui中完成一下窗口的搭建

首先在最上端放一个QWidget在里面放入label输入端口,再放一个LineEdit,它的Objectnameport表示输入的端口号,在右边放一个Pushbutton输入连接,Objectnameconnect

端口下面类似,LineEdit的Objectname是ip,PushButton的Objectname是disconnect

 然后在下面放一个QGroupBox,name改为历史信息表示服务器客户端发送的信息都会保存在这,在里面放一个TextEdit,Objectname改为record水平布局

下面类似,TextEdit的Objectname改为msg表示服务器要发送的信息,每次点击发送清空发送的信息框中的内容

最下面还是先放一个QGroupBox,中间放一个pushbutton输入发送,Objectname改为sendMsg,再水平布局

最后整体 垂直布局,这样服务器的窗口就搭建成功了

代码部分

mainwindow.h

 首先在头文件的类中的private中定义要用到的套接字

槽函数,在Ui中的按钮右键转到槽函数,自动定义,用来实现连接断开连接发送等功能

mianwindow.cpp

 在构造函数中对ui中的端口号、ip进行初始化,设置窗口标题为客户端,在未连接的时候将断开连接设置为不可使用;对头文件中定义的套接字进行实例化

三个connect,还是写在构造函数中;

第一个connct:如果服务器有消息发来,套接字就会收到一个readyRead的信号,使用匿名函数将发送来的内容追加到record中

第二个connect: 如果客户端连接到服务器,套接字就会收到connect的信号,使用匿名函数将成功连接发送到record中,如果连接成功就将连接按钮设置为不可操作,将断开连接按钮设置为可以操作

第三个connect:如果客户端与服务器断开连接,套接字会收到disconnect的信号,使用匿名函数将服务器已断开发送到record中,并将套接字关闭释放,如果断开就将连接按钮设置为可操作,将断开连接按钮设置为不可操作

点击按钮的三个槽函数的实现

点击senMsg就将msg文本框中的内容利用套接字write给服务器,然后再追加到record文本框中

点击connecr将ip和端口号保存,利用套接字中的connectToHost函数与服务器进行连接

点击disconnect将tcp套接字关闭,将连接按钮设置为可操作,断开连接设置为不可操作

通过以上步骤客户端也就实现完成了,以下是全部代码

全部代码

mianwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpSocket>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:


    void on_sendMsg_clicked();

    void on_connect_clicked();

    void on_disconnect_clicked();

private:
    Ui::MainWindow *ui;
    QTcpSocket *tcp;

};

#endif // MAINWINDOW_H

mianwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QHostAddress>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->port->setText("8899");
    ui->ip->setText("127.0.0.1");
    setWindowTitle("客户端");
    ui->disconnect->setDisabled(true);

    tcp = new QTcpSocket(this);

    connect(tcp,&QTcpSocket::readyRead,this,[=](){//如果tcp收到一个readyRead信号就
          QByteArray data = tcp->readAll();//把内容读出来放到data里
          ui->record->append("服务器say:" + data);//把内容追加到record中
      });

    connect(tcp,&QTcpSocket::connected,this,[=](){//如果套接字收到已连接消息,将成功连接发送到record中
        ui->record->append("成功连接服务器!");
         ui->disconnect->setDisabled(false);
         ui->connect->setDisabled(true);
    }) ;


    connect(tcp,&QTcpSocket::disconnected,this,[=](){//如果套接字收到断联消息,就关闭套接字并释放
        ui->record->append("服务器已断开!");
        tcp->close();
        tcp->deleteLater();

        ui->disconnect->setDisabled(true);
        ui->connect->setDisabled(false);
    }) ;

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_sendMsg_clicked()
{
    QString msg = ui->msg->toPlainText();
    tcp->write(msg.toUtf8());
    ui->record->append("服务器say:" + msg);
    ui->msg->clear();
}

void MainWindow::on_connect_clicked()
{
    QString ip = ui->ip->text();//将ip地址赋值
    unsigned short port = ui->port->text().toUShort();//将端口号赋值
    tcp->connectToHost(QHostAddress(ip),port); //connecttoHost函数用来连接服务器
}

void MainWindow::on_disconnect_clicked()
{
    tcp->close();
    ui->disconnect->setDisabled(true);
    ui->connect->setDisabled(false);
}

执行实例

 

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

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

相关文章

序列建模之循环和递归网络 - 双向RNN篇

序言 在序列建模的广阔领域中&#xff0c;循环神经网络&#xff08; RNN \text{RNN} RNN&#xff09;以其独特的循环结构&#xff0c;在处理序列数据方面展现出了强大的能力。然而&#xff0c;传统的单向 RNN \text{RNN} RNN在处理某些复杂任务时&#xff0c;如自然语言处理中…

基于51单片机的士出租车计价器proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1-GOrUrYlyGZFfkiiO6i5yg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

「Unity3D」TextMeshPro-Text(UI)无法拖放到TextMeshPro的属性面板上

继承MonoBehaviour&#xff0c;然后定义public TextMeshPro textPro&#xff0c;属性面板上就会有TextMeshPro的拖放槽&#xff08;slot&#xff09;&#xff0c;以配置含有TextMeshPro的组件对象&#xff08;GameObject&#xff09;。 但此时会发现&#xff0c;含有TextMeshPr…

李沐老师动手深度学习pytorch版本的读取fashion_mnist数据并用AlexNet模型训练,其中修改为利用本地的数据集训练

李沐老师的d2l.load_data_fashion_mnist里面没有root参数&#xff0c;所以只会下载&#xff0c;不能利用本地的fashion_mnist数据。所以我使用torchvision 的datasets里面FashionMNIST方法&#xff0c;又由于李沐老师此处是利用AlexNet模型来训练fashion_mnist数据&#xff0c;…

xiaomi pad 6PRO 小米平板6 pro hyperOS降级 澎湃os 降级MIUI 14 教程 免解锁BL 降级,168小时解锁绑定

小米平板 6 Pro 机型代号 &#xff1a;liuqin 降级MIUI 14 小米澎湃 OS 正式版 澎湃OS安卓发布日期卡刷包线刷包OS1.0.7.0.UMYCNXM14.02024-07-13miui_LIUQIN_OS1.0.7.0.UMYCNXM_d618a5c980_14.0.zipliuqin_images_OS1.0.7.0.UMYCNXM_20240705.0000.00_14.0_cn_8cbf5920be.…

Android14之解决编译libaaudio.so报错问题(二百二十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

OceanBase内存管理小窍门

本文来自OceanBase热心用户的实践分享。 本文主要是对OceanBase内存管理的实用技巧分享&#xff0c;而并非直接深入OceanBase的代码层面进行阐述。​​​​​​​ 阅读本文章你将了解&#xff1a; 重载运算符new 与malloc在返回值上区别&#xff1f;在ceph 双向链表新用法&am…

[240815] GPT-4o 系统安全卡 | AMD 完成对 Silo AI 的收购,加速 AI 模型在硬件上的开发和部署

目录 GPT-4o 系统安全卡AMD 完成对 Silo AI 的收购&#xff0c;加速 AI 模型在硬件上的开发和部署 GPT-4o 系统安全卡 一、概述 GPT-4o 是一个多模态模型&#xff0c;可以处理文本、音频、图像和视频输入&#xff0c;并生成文本、音频和图像输出。本文概述了 GPT-4o 发布前的…

Azure OpenAI Swagger Validation Failure with APIM

题意&#xff1a;Azure OpenAI Swagger 验证失败与 APIM 问题背景&#xff1a; Im converting the Swagger for Azure OpenAI API Version 2023-07-01-preview from json to yaml 我正在将 Azure OpenAI API 版本 2023-07-01-preview 的 Swagger 从 JSON 转换为 YAML。 My S…

快速排序算法详解及Python实现

目录 引言 快速排序算法步骤 快速排序的Python实现 性能分析 注意事项 引言 快速排序&#xff08;Quick Sort&#xff09;是一种高效的排序算法&#xff0c;由C. A. R. Hoare在1960年提出。它的基本思想是&#xff1a;通过一趟排序将待排序的数据分割成独立的两部分&…

数维原动:如何应对亿级规模的数据分析挑战|OceanBase案例

本文作者&#xff1a;贾万利&#xff0c;北京数维原动教育科技 业务背景 作为国内专注于高端教育评估的机构&#xff0c;北京数维原动教育科技有限公司&#xff0c;其核心业务聚焦于中小学学校的诊断、评估与提升工作。自2009年起&#xff0c;公司便踏上了自主研发之路。经过十…

Visual Studio VS 插件之 ReSharper

集成在VS2022上的ReSharper暂无找到汉化方式&#xff0c;如果有大神可以汉化&#xff0c;请指导下。 首先ReSharper 是IDE 下的插件 主要是基于C# 语句优化的这么一个插件。 使用ReSharper可以使开发效率大大提高&#xff0c;但是也是比较吃电脑的配置。所以说如果配置低的小…

移动开发(一):使用.NET MAUI开发第一个安卓APP

目录 一、.NET MAUI官方介绍 二、开发工具安装 三、创建项目 四、Windows Machine模式运行 五、安卓虚拟机方式运行 六、总结 对于工作多年的C#程序员来说,近来想尝试开发一款安卓APP,考虑了很久最终选择使用.NET MAUI这个微软官方的框架来尝试体验开发安卓APP,毕竟是…

C/C++开发---全篇

1、统筹 学习目标&#xff1a; C/C、python精通。 就业匹配方向&#xff1a;专精一个领域&#xff0c;延长职业生涯。 &#xff08;1&#xff09;适配行业&#xff1b; &#xff08;2&#xff09;量化&#xff1b; &#xff08;3&#xff09;安全&#xff1b; &#xff08;4&…

嵌入式系统可靠性设计案例分析

目录 案例 【题目】 【问题 1】(共 9 分) 【问题 2】(共 8 分) 【问题 3】(共 8 分) 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关知识 案例 阅读以下关于嵌入式系统可靠性设计方面的描述&#xff0c;回答问题 1 至问题 3。 【题目】 某宇航公司长期从事宇航装…

H7-TOOL混合脱机烧录以及1拖4不同的通道烧录不同的程序操作说明(2024-08-07)

【应用场景】 原本TOOL的1拖4是用于同时烧录相同程序给目标板&#xff0c;但有时候一个板子上有多个不同的MCU&#xff0c; 客户希望仅通过一个TOOL就可以完成对板子上多个MCU的烧录&#xff0c;也就是1拖4不同的通道烧录不同的程序&#xff0c;此贴为此制作。 【实验目标】…

Android+Jacoco+code-diff全量、增量覆盖率生成实战

背景 主要是记录下Android项目使用jacoco生成代码覆盖率的实战流程&#xff0c;目前已完成全量覆盖方案&#xff0c;仅使用jacoco就能实现&#xff1b; 由于我们的Android端是使用Java和kotlin语言,目前增量的方案code-diff仅针对Java代码&#xff0c;卡在kotlin文件的分析&am…

java 面试 PDF 资料整理

“尊贵的求知者&#xff0c;作者特此献上精心编纂的Java面试宝典PDF&#xff0c;这份资料凝聚了无数面试精华与实战经验&#xff0c;是通往Java技术殿堂的钥匙。若您渴望在Java编程的求职之路上稳健前行&#xff0c;只需轻轻一点&#xff0c;完成这象征支持与认可的一键三联&am…

Dubbo源码深度解析(五)

上一篇博客主要讲服务提供方服务的发布&#xff0c;以及Netty是如何启动的&#xff0c;客户端发过来的请求&#xff0c;会经过哪些处理器&#xff0c;以及补充之前没讲完的SPI机制等等。这篇博客将会接着继续讲&#xff0c;在看这篇博客之前&#xff0c;请先看上一篇博客&#…

VTK—vtkStructuredGrid提取维度面数据

1.在VTK自带的vtkStructuredGrid数据文件combq.bin和combxyz.bin 2.文件读取代码如下&#xff1a; //读取数据文件Create(vtkMultiBlockPLOT3DReader, reader);reader->SetXYZFileName("G:/Temp/vtkTest/combxyz.bin");reader->SetQFileName("G:/Temp/v…