网络通信(传输层协议:TCP/IP ,UDP):

Socket是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。

网络协议:一台电脑的数据怎么传递给另一台电脑,是由网络协议来规定的

端口号:类似于办事窗口,是在计算机网络中用于区分不同服务或应用程序的一种数字标识。每个正在运行的程序或服务都会监听或绑定到一个或多个端口号上,以便接收来自网络的数据包。

客户端软件从端口号发给服务器,服务器内的服务器软件会识别是哪个软件发出的,调用软件对应的处理

Socket主要分为以下几种类型:

  1. 流式套接字(TCP Socket)

    • 提供可靠的、面向连接的通信。
    • 数据按顺序传输,不丢失。
    • 建立连接时需要三次握手,断开时需要四次挥手。
    • 适用场景:文件传输、Web服务等。
  2. 数据报套接字(UDP Socket)

    • 提供快速但不可靠的通信。
    • 无需建立连接,直接发送数据。
    • 数据可能丢失,适合对速度要求高的场景。
    • 适用场景:实时音视频、在线游戏等。

TCP:面向连接的流式协议,数据安全,3次握手4次挥手,双向连接,双向断开,有数据校验机制

TCP的通信流程:

UDP:面向无连接报式协议,数据不安全,不需要连接,报文要是丢包就全丢了

UDP的通信流程:

  • QTcpServer(监听套接字)QTcpSocket(通讯套接字)

在项目的配置文件内添加   

QT       += core gui network

TCP的通信服务器端:

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QLabel>
#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();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::MainWindow *ui;///服务器QTcpServer *tcpServer;///监听端口QTcpSocket *tcpSocket;QLabel *Status;
};
#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);///1.创建服务器tcpServer=new QTcpServer(this);///设置端口号ui->lineEdit_port->setText("8899");connect(tcpServer,&QTcpServer::newConnection,this,[=](){///3.建立连接,获取监听对象tcpSocket=tcpServer->nextPendingConnection();//连接成功设置状态图片并缩放图片大小(已连接)Status->setPixmap(QPixmap(":/new/prefix1/img/a2.png").scaled(20,20));///4.检测是否可以接收数据connect(tcpSocket,&QTcpSocket::readyRead,this,[=](){QByteArray data=tcpSocket->readAll();ui->textBrowser->append("客户端说:"+data);});///6.检测断开连接connect(tcpSocket,&QTcpSocket::disconnected,this,[=](){///关闭套接字tcpSocket->close();///释放tcpSocket->deleteLater();//设置状态图片并缩放图片大小(未连接)Status->setPixmap(QPixmap(":/new/prefix1/img/a1.png").scaled(20,20));});});//设置状态栏Status=new QLabel;//设置状态图片并缩放图片大小(未连接)Status->setPixmap(QPixmap(":/new/prefix1/img/a1.png").scaled(20,20));ui->statusbar->addWidget(new QLabel("连接状态:"));ui->statusbar->addWidget(Status);
}MainWindow::~MainWindow()
{delete ui;
}///点击启动监听
void MainWindow::on_pushButton_clicked()
{///2.设置监听unsigned short port=ui->lineEdit_port->text().toUShort();tcpServer->listen(QHostAddress::Any,port);///启动监听按钮不可选ui->pushButton->setDisabled(true);
}
///发送按钮按下
void MainWindow::on_pushButton_2_clicked()
{QString str=  ui->textBrowser_2->toPlainText();///5.发送数据tcpSocket->write(str.toUtf8());ui->textBrowser->append("服务器说:"+str);
}

TCP的通信客户端:

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QLabel>
#include <QMainWindow>
#include <QTcpSocket>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_2_clicked();void on_pushButton_connect_clicked();void on_pushButton_disConnect_clicked();private:Ui::MainWindow *ui;///监听端口QTcpSocket *tcpSocket;QLabel *Status;
};
#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QHostAddress>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);///1.创建客户端tcpSocket=new QTcpSocket(this);///设置端口号ui->lineEdit_port->setText("8899");///设置ip(本地IP)ui->lineEdit_Ip->setText("127.0.0.1");///断开连接按钮不显示ui->pushButton_disConnect->setDisabled(true);///3.连接到服务器connect(tcpSocket,&QTcpSocket::connected,this,[=](){//设置状态图片并缩放图片大小(已连接)Status->setPixmap(QPixmap(":/new/prefix1/img/a2.png").scaled(20,20));ui->textBrowser->append("已连接到服务器");ui->pushButton_disConnect->setDisabled(false);ui->pushButton_connect->setDisabled(true);});///5.接收数据connect(tcpSocket,&QTcpSocket::readyRead,this,[=](){QByteArray data=tcpSocket->readAll();ui->textBrowser->append("服务器说:"+data);});///6.断开连接connect(tcpSocket,&QTcpSocket::disconnected,this,&MainWindow::on_pushButton_disConnect_clicked);//设置状态栏Status=new QLabel;//设置状态图片并缩放图片大小(未连接)Status->setPixmap(QPixmap(":/new/prefix1/img/a1.png").scaled(20,20));ui->statusbar->addWidget(new QLabel("连接状态:"));ui->statusbar->addWidget(Status);
}MainWindow::~MainWindow()
{delete ui;
}
///发送按钮按下
void MainWindow::on_pushButton_2_clicked()
{QString str=  ui->textBrowser_2->toPlainText();///4.发送数据tcpSocket->write(str.toUtf8());ui->textBrowser->append("客户端说:"+str);
}void MainWindow::on_pushButton_connect_clicked()
{///2.连接服务器QString ip=ui->lineEdit_Ip->text();unsigned short port=ui->lineEdit_port->text().toUShort();tcpSocket->connectToHost(QHostAddress(ip),port);
}void MainWindow::on_pushButton_disConnect_clicked()
{///关闭套接字tcpSocket->close();//设置状态图片并缩放图片大小(未连接)Status->setPixmap(QPixmap(":/new/prefix1/img/a1.png").scaled(20,20));ui->textBrowser->append("已断开服务器");ui->pushButton_disConnect->setDisabled(true);ui->pushButton_connect->setDisabled(false);
}

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

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

相关文章

DeepSeek进阶应用(二):结合Kimi制作PPT(双AI协作教程)

&#x1f31f;引言&#xff1a; DeepSeek作为国产AI大模型&#xff0c;以强大的逻辑推理和结构化内容生成能力著称&#xff0c;擅长根据用户需求生成PPT大纲或Markdown文本&#xff1b;Kimi的PPT助手则能解析结构化内容并套用模板快速生成美观的PPT&#xff0c;两者结合实现“内…

卷积神经网络(知识点)

一、为了使特征图变小&#xff1a; 由两种方法&#xff1a;1.增大步长&#xff1a;卷积的时候不是一次一步&#xff0c;而是一次多步&#xff0c;类似一张图片&#xff0c;在原来的像素基础上&#xff0c;每隔一个取一个像素点。 其中S就是步长 注意&#xff1a;扩大步长不经…

考研系列-408真题计算机网络篇(18-23)

写在前面 此文章是本人在备考过程中408真题计算机网络部分&#xff08;2018年-2023年&#xff09;的易错题及相应的知识点整理&#xff0c;后期复习也常常用到&#xff0c;对于知识提炼归纳理解起到了很大的作用&#xff0c;分享出来希望帮助到大家~ # 2018 1.停止-等待协议的…

std::invoke详解

基础介绍 c17版本引入了std::invoke特性&#xff0c;这是一个通用的调用包装器&#xff0c;可以统一调用&#xff1a; 普通函数成员函数函数对象Lambda表达式指向成员的指针 它的主要作用是提供一个统一的方式来调用各种可调用对象。 std::invoke依赖的头文件&#xff1a;#…

使用 PaddleNLP 在 CPU(支持 AVX 指令)下跑通 llama2-7b或DeepSeek-r1:1.5b 模型(完成度80%)

原文&#xff1a;&#x1f6a3;‍♂️ 使用 PaddleNLP 在 CPU(支持 AVX 指令)下跑通 llama2-7b 模型 &#x1f6a3; — PaddleNLP 文档 使用 PaddleNLP 在 CPU(支持 AVX 指令)下跑通 llama2-7b 模型 &#x1f6a3; PaddleNLP 在支持 AVX 指令的 CPU 上对 llama 系列模型进行了…

Kotlin高效实现 Android ViewPager2 顶部导航:动态配置与性能优化指南

高效实现&#xff1a;强调代码的性能优化。Android ViewPager2&#xff1a;明确技术栈。顶部导航&#xff1a;核心功能点。动态配置与性能优化指南&#xff1a;突出动态配置的灵活性和性能优化的重点。 在 Android 开发中&#xff0c;使用 ViewPager2 实现高效的顶部导航&…

六种最新优化算法(TOC、MSO、AE、DOA、GOA、OX)求解多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码

一、算法简介 &#xff08;一&#xff09;阿尔法进化&#xff08;Alpha Evolution&#xff0c;AE&#xff09;算法 阿尔法进化&#xff08;Alpha Evolution&#xff0c;AE&#xff09;算法是2024年提出的一种新型进化算法&#xff0c;其核心在于通过自适应基向量和随机步长的…

上传本地项目到GitHub

一、在GitHub上创建仓库 1.点击右上角头像–>点击Your repositories 2.点击New 3.创建仓库 网址复制一下&#xff0c;在后面git上传时会用到 二、打开Git Bash 1.cd 进入项目所在路径 2.输入git init 在当前项目的目录中生成本地的git管理&#xff08;当前目录下出现.…

14.使用各种读写包操作 Excel 文件:辅助模块

一 各种读写包 这些是 pandas 在底层使用的各种读写包。无须安装 pandas&#xff0c;直接使用这些读写包就能够读写 Excel 工作簿。可以尽可能地使用 pandas 来解决这类问题&#xff0c;只在 pandas 没有提供你所需要的功能时才用到读写包。 表中没有 xlwings &#xff0c;因为…

ubuntu ollama+dify实践

安装ollama 官网的指令太慢了&#xff0c;使用以下指令加速&#xff1a; export OLLAMA_MIRROR"https://ghproxy.cn/https://github.com/ollama/ollama/releases/latest/download" curl -fsSL https://ollama.com/install.sh | sed "s|https://ollama.com/dow…

spring boot+mybaits多条件模糊查询和分页查询

我们首先写一下多条件的模糊查询&#xff0c;首先在controller里面写一个接口&#xff0c;进行传参&#xff0c;我们这里要注意&#xff0c;之前写修改和增加的时候用的注解都是RequestBody,也就是说&#xff01;前端传过来一个json&#xff0c;数组也行&#xff0c;然后我们后…

HarmonyOS NEXT - 电商App实例四(登录界面)

登录界面是用户进入App的第一步&#xff0c;因此需要简洁明了&#xff0c;同时保持品牌风格的一致性。如&#xff1a;顶部区域为品牌LOGO展示&#xff0c;增加品牌识别度&#xff1b;中间区域为登录表单&#xff0c;包含输入框和按钮&#xff1b;底部区域为其他登录方式、注册入…

探索ima.copilot:个人知识库搭建的AI新利器

在信息爆炸的时代&#xff0c;知识的积累与管理成为了个人发展的关键。面对海量的科研文献、工作资料和各类信息&#xff0c;如何高效地构建属于自己的知识体系&#xff0c;是许多人面临的挑战。ima.copilot这款AI工具的出现&#xff0c;为解决这一难题提供了新的思路。它凭借强…

图解多头注意力机制:维度变化一镜到底

目录 一、多头注意力机制概述二、代码实现1. pyTorch 实现2. tensorFlow实现 三、维度变化全流程详解1. 参数设定2. 维度变化流程图3. 关键步骤维度变化 四、关键实现细节解析1. 多头拆分与合并2. 注意力分数计算3. 掩码处理技巧 五、完整运行示例六、总结与常见问题1. 核心优势…

Interview preparation.md

Vue 1.1 响应式系统 Vue 3 使用 Proxy 代替 Vue 2 中的 Object.defineProperty 来实现响应式系统。Proxy 可以监听对象的所有操作&#xff0c;包括属性的添加和删除&#xff0c;从而解决了 Vue 2 的一些局限性。 Vue 2&#xff1a;使用 Vue.set 添加响应式属性 new Vue({el…

2.8滑动窗口专题:最小覆盖子串

1. 题目链接 LeetCode 76. 最小覆盖子串 2. 题目描述 给定字符串 s 和 t&#xff0c;要求找到 s 中最小的窗口&#xff0c;使得该窗口包含 t 的所有字符&#xff08;包括出现次数&#xff09;。若不存在&#xff0c;返回空字符串。 示例&#xff1a; 输入&#xff1a;s &quo…

【数据分析大屏】基于Django+Vue汽车销售数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅

目录 一、项目背景 二、项目创新点 三、项目功能 四、开发技术介绍 五、项目功能展示 六、权威视频链接 一、项目背景 汽车行业数字化转型加速&#xff0c;销售数据多维分析需求激增。本项目针对传统报表系统交互性弱、实时性差等痛点&#xff0c;基于DjangoVue架构构建…

cyberstrikelab lab2

lab2 重生之我是渗透测试工程师&#xff0c;被公司派遣去测试某网络的安全性。你的目标是成功获取所有服务器的权限&#xff0c;以评估网络安全状况。 先扫一下 ​ ​ 192.168.10.10 ​ ​ 骑士cms 先找后台路径 http://192.168.10.10:808/index.php?madmin&cind…

在 Ubuntu 服务器上使用宝塔面板搭建博客

&#x1f4cc; 介绍 在本教程中&#xff0c;我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板&#xff0c;并使用 Nginx PHP MySQL 搭建一个博客&#xff08;如 WordPress&#xff09;。 主要步骤包括&#xff1a; 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…

PTA7-13 统计工龄

题目描述 给定公司 n 名员工的工龄&#xff0c;要求按工龄增序输出每个工龄段有多少员工。 输入格式: 输入首先给出正整数 n&#xff08;≤105&#xff09;&#xff0c;即员工总人数&#xff1b;随后给出 n 个整数&#xff0c;即每个员工的工龄&#xff0c;范围在 [0, 50]。…