QT从入门到入土(九)——TCP/IP网络通信(以及文件传输)

2023-11-14

**

引言

**
TCP/IP通信(即SOCKET通信)是通过网线将服务器Server端和客户机Client端进行连接,在遵循ISO/OSI模型的四层层级构架的基础上通过TCP/IP协议建立的通讯。控制器可以设置为服务器端或客户端。

关于TCP/IP协议可详看:TCP/IP协议详解 - 知乎 (zhihu.com)

总的来说,TCP/IP通讯有两个部分:

客户端和服务器
QTcpServer(监听套接字)和QTcpSocket(通讯套接字)

监听套接字,顾名思义,监听关于各种通讯的状态,一旦进行通讯,监听套接字会启动通讯套接字,进行通讯

客户端使用connectToHost函数主动连接服务器后,服务器会触发newConnectio这个槽函数,并进行取出QTcpServer(监听套接字),将相关内容取出并赋给QTcpSocket(通讯套接字)。
客户端向服务器发送数据,触发readyRead(),进行处理,彼此传递时,原理都是这样的。

对双方来说都起作用的部分:

一旦建立连接,就会触发connected,服务器特殊一点,触发的是newConnectio
互传数据也是一样的,一旦接受到,就会触发readyread
服务器中,需要监听套接字以及通讯套接字,监听套接字用于监听客户端是否给服务器发送请求

本篇博文做了初步的学习与尝试,编写了一个客户端和服务器基于窗口通信以及文件传输的小例程。

**

一,客户端

**
客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步:

(1)创建QTcpSocket套接字对象

  socket = new QTcpSocket(this);

(2)使用这个对象连接服务器

QString ip = ui.lineEdit_ip->text();//获取ip
int port = ui.lineEdit_2->text().toInt();//获取端口数据
socket->connectToHost(ip, port);

(3)使用write函数向服务器发送数据

QByteArray data = ui.lineEdit_3->text().toUtf8();//获取lineEdit控件中的数据并发送给服务器
socket->write(data);

(4)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据

connect(socket, &QTcpSocket::readyRead, this, &QTcpClinet::ReadData);
void QTcpClinet::ReadData()
{
   
    QByteArray buf = socket->readAll();
    ui.textEdit->append(buf);
}

(5)断开与服务器的连接(关于close()和disconnectFromHost()的区别,可以按F1看帮助)

socket->disconnectFromHost();

客户端例程:(新建一个qt项目QTcpClinet(客户机))在这里插入图片描述

ui界面

本地回路ip:127.0.0.1 可以连接到本地ip(电脑内部循环的ip)

如果要和局域网其他ip连接 -> 在运行(win+R)+cmd+ipconfig ->ipv4地址 查看本机ip

QTcpClinet.h

#include <QtWidgets/QWidget>
#include "ui_QTcpClinet.h"
#include"QTcpSocket.h"
#pragma execution_character_set("utf-8")
class QTcpClinet : public QWidget
{
   
    Q_OBJECT

public:
    QTcpClinet(QWidget *parent = Q_NULLPTR);
    ~QTcpClinet();
public slots:
    void on_btn_connect_clicked();
    void ReadData();
    void on_btn_push_clicked();
private:
    Ui::QTcpClinetClass ui;
    QTcpSocket* socket;//创建socket指针
};

QTcpClinet.cpp

#include "QTcpClinet.h"

QTcpClinet::QTcpClinet(QWidget *parent)
    : QWidget(parent)
{
   
    ui.setupUi(this);
    socket = new QTcpSocket(this);
}

QTcpClinet::~QTcpClinet()
{
   
    delete this->socket;//回收内存
}

void QTcpClinet::on_btn_connect_clicked()
{
   
  if (ui.btn_connect->text()==tr("连接服务器"))
  {
   
    QString ip = ui.lineEdit_ip->text();//获取ip
    int port = ui.lineEdit_2->text().toInt();//获取端口数据
    //取消已有的连接
    socket->abort();
    //连接服务器
    socket->connectToHost(ip, port);
    bool isconnect = socket->waitForConnected();//等待直到连接成功
    //如果连接成功
    if (isconnect)
    {
   
        ui.textEdit->append("The connection was successful!!");
        ui.btn_push->setEnabled(true);//按钮使能
        //修改按键文字
        ui.btn_connect->setText("断开服务器连接");
        //接收缓冲区(服务器)信息
        connect(socket, &QTcpSocket::readyRead, this, &QTcpClinet::ReadData);
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT从入门到入土(九)——TCP/IP网络通信(以及文件传输) 的相关文章

随机推荐

  • vue3表格导出excel

    下载依赖 npm install xlsx 引入依赖 import as XLSX from xlsx 使用
  • Python内置类型转换函数

    chr i chr 函数返回ASCII码对应的字符串 gt gt gt print chr 65 A gt gt gt print chr 66 B gt gt gt print chr 65 chr 66 AB complex real
  • stm32f103zet6移植标准库的sdio驱动

    sdio移植 st官网给的标准库有给一个用于st出的评估板的sdio外设实现 但一是文件结构有点复杂 二是相比于国内正点原子和野火的板子也有点不同 因此还是需要移植下才能使用 当然也可以直接使用正点原子或野火提供的实例 但为了熟悉下sdio
  • C#委托、C++委托实现、C回调函数

    C 委托 C 中的委托 Delegate 定义了方法的类型 使得可以将方法当作另一个方法的参数来进行传递 这种将方法动态地赋给参数的做法 可以避免在程序中大量使用if else switch 语句 同时使得程序具有更好的可扩展性 委托特别用
  • 从NSGA到 NSGA II

    NSGA 非支配排序遗传算法 NSGAII 带精英策略的非支配排序的遗传算法 都是基于遗传算法的多目标优化算法 都是基于pareto最优解讨论的多目标优化 遗传算法已经做过笔记 下面介绍pareto 帕累托 最优解的相关概念 本文是基于参考
  • Qt实现俄罗斯方块

    在经过基础内容的学习和简单的小示例练习后 这节我们用Qt做个俄罗斯方块小游戏 本文会描述实现俄罗斯方块的部分思路 代码开源 详细可见代码 链接获取方式 开源代码已上传gitee 关注 程序媛讲QT 公众号 回复 俄罗斯方块 获取链接 俄罗斯
  • 三分钟理解Java中字符串(String)的存储和赋值原理

    可能很多Java的初学者对String的存储和赋值有迷惑 以下是一个很简单的测试用例 你只需要花几分钟时间便可理解 1 在看例子之前 确保你理解以下几个术语 栈 由JVM分配区域 用于保存线程执行的动作和数据引用 栈是一个运行的单位 Jav
  • react中的export什么函数能导出_esModuleInterop 到底做了什么?

    问题引入 很多 react 使用者在从 JS 迁移到 TS 时 可能会遇到这样一个问题 JS 引入 react 是这样的 js import React from react 而 TS 却是这样的 ts import as React fr
  • 个人号微信二次开发,微信ipad协议

    E云是什么 E云API 是一套完整的的微信第三方服务平台 包含个微API服务与企微API服务模块 本文档主要讲述个微API服务相关 以下简称API 它能处理用户微信中的各种事件 并辅助微信执行各种操作 提供了开发者与个人号对接的能力 技术上
  • 黑盒测试用例设计方法--场景法

    8 场景法 8 1定义 场景法是通过运用场景来对系统的功能点或业务流程的描述 从而提高测试效果的一种方法 场景法一般包含基本流和备用流 从一个流程开始 通过描述经过的路径来确定的过程 经过遍历所有的基本流和备用流来完成整个场景 场景主要包括
  • 使用Xshell连接Ubuntu

    1 6 1 使用Xshell连接Ubuntu 使用命令ifconfig查看虚拟机IP地址 如图1 xx所示 图1 xx 使用如下命令安装ssh 以让Xshell软件远程连接到Ubuntu系统中 sudo apt get install op
  • CSS行高(line-height)使文本垂直居中详解

    一 场景重现 在我们的静态页面设计中 在我们的块级元素中写入文字时 div class center 我想在中间 div center height 50px background color 008c8c 会发现我们最后在网页显示的效果为
  • PCB电路板上各种标志的含义

    目录 一 PCB电路板上各种标志的含义 1 防静电标志 2 WEEE标志 3 国内认证 4 全球认证 5 北美认证 6 欧盟认证 7 韩国认证 8 日本认证 9 澳大利亚认证 一 PCB电路板上各种标志的含义 链接 PCB电路板上各种标志的
  • vue3中使用百度地图BMAP

    在Vue3中使用百度地图 可以按照以下步骤进行 1 在项目中引入百度地图的API文件 可以在public index html文件中添加以下代码 其中 密钥可以在百度地图开放平台申请 2 在需要使用地图的组件中引入BMap对象和BMapGL
  • Prompt GPT推荐社区

    大家好 我是荷逸 这次给大家带来的是我日常学习Prompt社区推荐 Snack Prompt 访问地址 http snackprompt com Snack Prompt是一个采用的Prompts诱导填空式的社区 它提供了一种简单的prom
  • vpdn-l2tp(cisco)

    ra config interface serial 1 0 config if ip add 173 16 1 1 255 255 255 252 config if no sh config if exit config vpdn en
  • java中常用的队列

    一 java中的队列 Queue 基本上 一个队列就是一个先入先出 FIFO 的数据结构 Queue接口与List Set同一级别 都是继承了Collection接口 LinkedList实现了Deque接口 二 非阻塞队列 非阻塞队列不能
  • 一个价值一千五的外包项目!抓取大众点评的店铺信息!

    前言 今天在群里有人派外包的其中一个是抓取大众点评的店铺信息 价格一千五 三天内完成 很多刚学编程的小伙伴 应该觉得这个一千五也太容易拿了 相对于大众点评这个网站 其实不是像爬小说 爬表情包那样容易的 大众点评这个网站它是有反爬的 其实也就
  • Vue——v-slot父组件调用子组件内的值

    首先声明子组件 设置3个slot插槽 分别为header main和默认插槽
  • QT从入门到入土(九)——TCP/IP网络通信(以及文件传输)

    引言 TCP IP通信 即SOCKET通信 是通过网线将服务器Server端和客户机Client端进行连接 在遵循ISO OSI模型的四层层级构架的基础上通过TCP IP协议建立的通讯 控制器可以设置为服务器端或客户端 关于TCP IP协议